在 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_;
我正在尝试创建一个程序,根据用户输入打开或关闭代码的某些部分。当 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_;