我不认为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.
答案 0 :(得分:2)
当您将标记传递给宏时,它们会按字面解释。所以当你指定
时 !compLastAvail name="VIXCL3"
它会以compute
的形式传递给相应的"VIXCL3"
语句,而不仅仅是没有引号的变量名称(例如VIXCL3
)。
另外两条一般性建议;
如果在执行宏之前执行命令set mprint on
,您将看到令牌如何传递给宏。在这种情况下,如果您采取了这一步骤,您将看到违规的计算语句和错误消息。
有时你会在令牌中使用引号,在这种情况下,字符串命令!QUOTE
和!UNQUOTE
会派上用场。