2012-01-13 125 views
2

计算,我不认为SPSS宏可以返回值,所以不是像分配一个VIXL3 = !getLastAvail target=VIX level=3价值我想我需要做这样的事情:SPSS宏:通过变量名

/* 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

将'VIXCL3'传递给宏时,不应该用引号引起来。当宏被执行时,你是否设置'mprint on'来查看已编译的代码?如果你提供一个玩具数据集来展示你正在努力完成的任务,它也会使其他人的工作变得更容易。 – 2012-01-13 22:15:06

+0

@AndyW优秀,谢谢。如果你复制粘贴作为答案,我可以接受它。 – Tom 2012-01-13 23:11:35

回答

2

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

!compLastAvail name="VIXCL3"

它被传递到相应的compute语句"VIXCL3",而不是不带引号(如VIXCL3)只是一个变量名。

另外两条建议;

  1. 如果你做的命令set mprint on您执行宏之前,你会看到你的令牌是如何传递给宏。在这种情况下,如果你已经采取了这一步,你会看到有问题的计算语句和错误消息。

  2. 有时你会用标记中的引号做什么,如果是这种情况,字符串命令!QUOTE!UNQUOTE就派上用场了。