Макрос SPSS: вычисление по имени переменной - PullRequest
2 голосов
/ 14 января 2012

Я не думаю, что макросы SPSS могут возвращать значения, поэтому вместо присвоения значения типа VIXL3 = !getLastAvail target=VIX level=3 я решил, что мне нужно сделать что-то вроде этого:

/* computes last available entry of target at given level */
define !compLastAvail(name !Tokens(1) /target !Tokens(1) /level !Tokens(1))
   compute tmpid= $casenum.
   dataset copy tmpset1.
   select if not miss(!target).
   compute !name= lag(!target, !level).
   match files /file= * /file= tmpset1 /by tmpid.
   exec.
   delete variables tmpid.
   dataset close tmpset1.
!enddefine.

/* compute last values */

!compLastAvail name="VIXCL3" target=VIXC level=3.

Проблема в compute !name = ....

Как это сделать правильно? Вышеуказанное возвращает:

>Error # 4285 in column 9.  Text: VIXCL3
>Incorrect variable name: either the name is more than 64 characters, or it is
>not defined by a previous command.
>Execution of this command stops.

1 Ответ

2 голосов
/ 14 января 2012

Когда вы передаете токены в макрос, они интерпретируются буквально.Поэтому, когда вы указываете

!compLastAvail name="VIXCL3"

Он передается соответствующему оператору compute как "VIXCL3", а не просто как имя переменной без кавычек (например, VIXCL3).

Два других общих совета;

  1. Если вы выполните команду set mprint on перед выполнением макроса, вы увидите, как ваши токены передаются в макрос,В этом случае, если бы вы сделали этот шаг, вы бы увидели, что оператор вычисления и сообщение об ошибке нарушают работу.

  2. Иногда вы делаете то, что нужно использовать кавычки в токенах, и когда этоВ этом случае строковые команды !QUOTE и !UNQUOTE пригодятся.

...