1

在用户定义模块中的 SAS 系统的 proc IML 中,我希望能够通过将向量的名称作为参数来访问向量中的数据。

例如,在下面的代码中,名为“test”的模块构建了两个字符串“x_vec1”和“x_vec2”,但不打印这两个向量的内容,而是打印它们的名称(我认为提交块产生相同的结果)。

这个概念很容易使用宏通过在宏中调用 IML 来实现,但我想纯粹在 IML 中完成它以保持代码“干净”。虽然 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;
4

2 回答 2

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;

不确定这是否为您提供所需的灵活性;如果您尝试做一些更复杂的事情,您可能想澄清最终结果需要是什么。

于 2014-10-03T15:23:14.953 回答
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;
于 2014-10-03T16:35:47.530 回答