Macros SPSS宏:按变量名计算

Macros SPSS宏:按变量名计算,macros,spss,Macros,Spss,我不认为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

我不认为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.

当您将令牌传递给宏时,它们会被逐字解释。所以当你指定

!compLastAvail name=“VIXCL3”

它以
“VIXCL3”
的形式传递给相应的
compute
语句,而不仅仅是没有引号的变量名(例如
VIXCL3

另外两条一般性建议

  • 如果在执行宏之前执行命令
    set mprint on
    ,您将看到令牌是如何传递到宏的。在本例中,如果您采取了该步骤,您将看到有问题的compute语句和错误消息

  • 有时,您需要在标记中使用引号,在这种情况下,字符串命令
    !引用
    !UNQUOTE
    派上用场


  • VIXCL3
    传递给宏时,不应将其置于引号中。您是否设置了
    mprint on
    以在执行宏时查看编译后的代码?另外,如果你提供一个玩具数据集来展示你正在努力完成的事情,它会使其他人的工作更容易得到帮助。@AndyW太好了,谢谢。如果你复制粘贴作为一个答案,我可以接受它。