【发布时间】:2018-04-18 23:57:45
【问题描述】:
我正在尝试向 SAS 日志打印一条语句,提醒用户某些程序未运行。为此,我使用 put 语句打印到 SAS 日志:
%let step1 = My program;
%let rec= cats(&step1.);
data _null_;
put "** &rec. did not run";
run;
put 语句打印:“** 猫(我的程序)没有运行”。有谁知道为什么 cat 函数没有执行?我猜这与在 SAS 语句之前执行的宏代码有关,但我不确定如何使它工作。
编辑
感谢 Reeza 和 Tom。现在我明白了为什么这不起作用 - 我必须使用 %sysfunc 来使用数据步骤之外的函数,并且我不能在 put 语句中使用函数。
Tom - 你要求一个更完整的例子:
我正在尝试在 SAS 日志中打印一条语句,以便用户可以轻松查看哪些程序运行了哪些程序被跳过了。我正在尝试完成以下操作:
data _null_;
array steps(*) $ step1-step7;
do i=1 to dim(steps);
if symget(cats('run',i)) = 'N' then
put "** The program "symget(cats('run',i)" did not run";
end;
run;
我想如果我能弄清楚如何在 put 语句中执行一个函数,那么这段代码就可以工作。然而,这是不可能的。不过,我 应该 能够让变量随“i”一起改变。
例如,当 i 为 1 时,put 语句应为“程序 file1.sas 未运行”。
当 i 为 2 时,put 语句应该是“程序 file2.sas 没有运行”,等等。
我尝试使用:
put "** The program &&step&i did not run";
但 SAS 无法识别我的变量。
希望这能提供更多背景信息!
【问题讨论】:
-
你为什么还有那一步?
-
您不能在
PUT语句的中间包含函数。您的PUT语句甚至没有尝试调用函数,因为它只是放置了一个字符文字。您的第二个%LET语句没有尝试调用cats()函数,因为您没有使用%sysfunc()宏函数。你有一个更有意义的例子来说明你正在尝试做的事情吗? -
除了设置 DO 循环的上限之外,ARRAY 步骤还做了什么?
-
听起来您有 14 个宏变量,RUN1 到 RUN7 和 STEP1 到 STEP7,您希望将它们视为 7 对,并在 RUNx 宏变量具有特定值时打印 STEPx 宏变量。跨度>