在用户定义模块中的SAS系统的proc IML中,我希望能够通过将向量的名称作为参数来访问向量中的数据。
例如,在下面的代码中,名为" test"构建两个字符串" x_vec1"和" x_vec2"但不打印这两个向量的内容,而是打印它们的名称(我认为提交块会产生相同的结果)。
通过在宏中调用IML,可以很容易地使用宏来实现这个概念,但是我想在IML中完全使用它来保持代码" clean"。虽然IML对于统计工作来说非常出色,但我还需要更多 - 我需要通过将一个类似的概念作为宏变量来保持我的代码,这个宏变量可以在运行时在函数内解析。
proc iml;
start test(ep);
str = concat("x_",ep);
print str;
finish;
x_vec1 = J(10,1,34);
x_vec2 = J(10,1,67);
run test("vec1");
run test("vec2");
quit;
答案 0 :(得分:3)
您问题的简短回答是您需要value
功能。
proc iml;
x_vec1 = J(10,1,34);
str = cats('x_','vec1');
_temp = value(str);
print(_temp);
quit;
然而,它并不像你编程的那样在子程序中工作。这是因为子程序需要知道它被允许作为全局变量访问变量x_vec1
- 你实际上可以在这里做,因为你指定它在飞行中。
然而,您可以通过PUSH
将命令返回到调用环境来解决此问题。
start test(ep);
str = cats('print(x_',ep,')');
print(str);
call push(str);
finish;
不确定这是否为您提供所需的灵活性;如果你想做一些更复杂的事情,你可能想澄清最终结果需要做什么。
答案 1 :(得分:1)
使用上面的Joe的答案,这个新的例子访问了2个名为" x_vec1"和" x_vec2"并为每个元素添加用户定义的金额。因此,我认为这种方法可用于创建可重用的代码,该代码将矢量/矩阵名称作为参数。
proc iml;
start test(ep,n);
str1 = cats('print(x_',ep,');');
print str1;
str2 = cats('y_',ep,'= x_',ep,'+',char(n),';');
print str2;
str3 = cats('print(y_',ep,');');
print str3;
call queue(str1,str2,str3);
finish;
x_vec1 = J(10,1,34);
x_vec2 = J(10,1,67);
run test("vec1",10);
run test("vec2",100);
quit;