【问题标题】:How do I use a function within a put statement? SAS如何在 put 语句中使用函数? SAS
【发布时间】: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 宏变量。跨度>

标签: function logging sas


【解决方案1】:

您可以添加 %SYSFUNC() 以在数据步骤之外使用函数,但在这种情况下,CATS 不会为您的流程添加任何价值。

%let step1 = My program;
%let rec= %sysfunc(cats(&step1.));

data _null_;
put "** &rec.  did not run";
put "** &step1.  did not run";
run;

输出:

293
294
295  %let step1 = My program;
296  %let rec= %sysfunc(cats(&step1.));
297
298  data _null_;
299  put "** &rec.  did not run";
300  put "** &step1.  did not run";
301  run;

** My program  did not run
** My program  did not run
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

【讨论】:

    【解决方案2】:

    如果您正在运行宏,则只需使用 %DO 循环。

    %do i=1 %to 7 ;
      %if (N=&&run&i) %then %put NOTE: The program &&step&i did not run;
    %end;
    

    否则,只需使用数据步长变量并将其打印出来。

    data _null_;
      do i=1 to 7 ;
        if symget(cats('run',i)) = 'N' then do;
          length program $100 ;
          program=symget(cats('step',i));
          put 'NOTE: The program ' program 'did not run';
        end;
      end;
    run;
    

    【讨论】:

    • 谢谢!这就是我想要做的。很抱歉与数组变量混淆!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多