0

SAS/IML では、マクロで定義された変数への参照をユーザー定義モジュールに渡そうとします。モジュールは変数値を変更します。関数の呼び出しは do ループ内にあるため、&-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 呼び出しの結果) を送信しています。その一時変数は更新され、すぐに消えてしまいます。これについては、「ああ、厄介な一時変数です!」という記事で説明されています。

マクロ変数 (テキスト文字列) の代わりに、記事「間接代入: x1、x2、...、xn という名前の行列を作成して使用する方法」で説明されているように、VALUE 関数と VALSET 関数を使用 する必要があります。次のように、値が正しく更新されるように実数行列で:

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 に答える