在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
有什么想法吗?
解决
非常感谢!
答案 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;