0

在 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 

有任何想法吗?


解决了

非常感谢!

4

1 回答 1

0

您正在发送一个临时标量矩阵(SYMGET 调用的结果)。正如文章“哦,那些讨厌的临时变量!”中所解释的那样,该临时变量正在更新并立即消失。

您应该使用 VALUE 和 VALSET 函数代替宏变量(文本字符串),如文章“间接赋值:如何创建和使用名为 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;
于 2015-01-09T15:10:42.963 回答