【发布时间】:2016-08-04 00:44:20
【问题描述】:
我正在尝试在数据步骤中生成代码,然后将代码传递到一个宏中,然后运行该代码。我知道这有点迂回,但我想不出更好的解决方案,因为我的代码内容是基于数据集中的内容。
在我的数据集“test2”中,我只有一个变量“statement”的观察值,它等于
j1=输入(j,anydtdtm.);下降 j;重命名 j1=j; k1=输入(k,anydtdtm。);下降 k;重命名 k1=k; l1=输入(l,anydtdtm。);下降 l;重命名 l1=l;
我有一个宏,基本上是
%macro dummy(ds,statements);
data &ds.2;
set &ds.;
&statements.
run;
%mend;
然后我使用调用执行到以下内容:
data test3;
set test2;
call execute('%dummy('||strip(ds)||','||strip(statement)||')');
run;
但我收到以下错误:
ERROR: The keyword parameter J1 was not defined with the macro.
显然 SAS 将我的“=”符号解释为宏变量的内容以外的内容。我尝试使用 %str 并将我的调用执行更改为:
data test3;
set test2;
call execute('%dummy('||strip(ds)||','||%str(strip(statement))||')');
run;
但它没有用。有人有什么想法吗?
感谢您的帮助!!
【问题讨论】:
-
您似乎正在尝试自动转换类型?使用动态重命名语句,数据步骤中的数组可能会更好?如果你单独传递变量名并且有一个系统,那么宏应该会生成其余的代码。
-
我正在自动转换,但在确定要转换哪些变量之前,我必须遍历整个数据集
-
@JonathanWilson 您正在研究我所说的“已解决的问题”,因为我们很多人都遇到过同样的问题。如果您想要关于如何减少迂回的建议,请发布另一个问题,其中包含有关您实际在做什么的更多详细信息 - 在您到达之前它是什么样子上面的变量。最终被用来填充它的东西。有无数种方法可以解决这个问题;你的不错,但有更好的,我很乐意给我的(我相信其他人也会)。
-
请保持原样;这是宏引用的一个很好的例子和一些绕过它的方法。
-
@Joe 感谢您的提示!我并没有真正想到要询问您对“如何”问题的所有想法,但这真的很酷!我会发布另一个问题
标签: parameters macros sas call execute