在 SAS 中使用切换语句

Using Toggle Statements in SAS

我正在尝试创建一个程序,根据用户输入打开或关闭代码的某些部分。当 prog1 变量设置为等于 Y 时,下面的代码应该只 运行。但是,我的日志显示代码 运行s 无论如何。有谁知道是怎么回事吗?

代码:

%let prog1 = Y;
%let prog2 = N;

data _null_;
if "&prog1." = "Y" then do;
    %findit(&file1.);
    %findit(&file2);
end;
run;

data _null_;
if "prog2." = "Y" then do;
    %findit(&file3.);
end;
run;

日志:

您的代码有一些错误。 (在数据集中使用宏函数,在调用宏变量时滥用 &(安培))。

1) 始终使用 &(安培)来调用宏变量 2)添加一个点,如&path。必要时,如果 &path 宏变量后面有另一个字符串或宏变量。 3) 更喜欢使用带有 %if、%then 等的宏函数进行检查

你应该让你的程序更面向宏观:

%let prog1 = Y;
%let prog2 = Y;

%macro check();

%if "&prog1." = "Y" %then %do;
    %put execute 1;
    %findit(&file1);
    %findit(&file2);
%end;

%if "&prog2." = "Y" %then %do;
    %put execute 2;
    %findit(&file3);
%end;

%mend;

%check;

现在可以使用了,

此致,

它正在按照您的指示进行操作。将首先评估宏引用和宏代码。然后宏引用生成的任何 SAS 代码都将由 SAS 处理。因此,您已经编写了一个 DATA 步,它将有条件地跳过宏生成的 SAS 代码。但是宏本身总是 运行.

如果您将主程序编码为宏而不是打开 SAS 代码,那么您可以添加宏逻辑,例如 %IF 以有条件地生成宏调用。

或者对于这个简单的示例,您可以使用 CALL EXECUTE() 或其他代码生成方法来控制宏调用的生成。这样,如果条件为假,SAS 将永远不会在输入流中看到宏调用。

data _null_;
  if "&prog1." = "Y" then do;
    call execute('%nrstr(%findit)(&file1.)');
    call execute('%nrstr(%findit)(&file2.)');
  end;
run;

您的第二个 if 语句正在检查 "prog2." 而不是“&prog2”。在您的日志中,宏变量“&prog3”。是得到解决而不是 &prog1 的那个。和 &prog2.

尝试将此添加到将所有用户宏变量打印到日志的代码中。

%put _user_;