2012-01-13 108 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就派上用場了。