SAS IML传递对宏中定义的变量的引用

时间:2015-01-08 16:13:54

标签: macros reference module sas-iml

在SAS / IML中,我尝试向用户定义的模块传递对宏中定义的变量的引用。模块更改变量值。 由于该函数的调用是在do-loop中,我不能使用& -sign 。但是,使用 symget 不起作用。这是我的代码。

proc iml;
    start funcReference(argOut);

        print "funcReference " argOut;
        argOut = 5;

    finish funcReference;
    store module=funcReference;
quit;

proc IML;
    mydata1 = {1 2 3};
    call symput ('macVar', 'mydata1');

    load module=funcReference;
    run funcReference(symget('macVar'));

    print mydata1;
quit;

输出显示变量 mydata1 未更改:

argOut 
funcReference mydata1 

mydata1 
1 2 3 

有什么想法吗?


解决

非常感谢!

1 个答案:

答案 0 :(得分:0)

您正在发送临时标量矩阵(SYMGET调用的结果)。正如文章"Oh, those pesky temporary variables!"

中所解释的那样,临时变量正在更新并迅速消失

而不是宏变量(文本字符串),您应该使用VALUE和VALSET函数,如文章"Indirect assignment: How to create and use matrices named x1, x2,..., xn"中所述。您需要发送一个真实的矩阵,以便正确更新值,如下:

proc IML;
load module=funcReference;
mydata1 = {1 2 3};
call symput('macVar', 'mydata1');

matrixName = symget('macVar');  /* matrix named &mydata1 */
z = value(matrixName);          /* z contains data */
run funcReference(z);           /* update values in z */
call valset(matrixName, z);     /* update data in &mydata1 */

print mydata1;