proc IML中的代码重用:通过将其名称指定为字符串来访问向量的内容

时间:2014-10-03 14:40:38

标签: sas sas-iml

在用户定义模块中的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;

2 个答案:

答案 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;