If statement 在SAS中使用切换语句
我试图创建一个程序,根据用户输入打开或关闭代码的某些部分。下面的代码应该只在prog1变量设置为Y时运行。但是,我的日志显示,无论发生什么情况,代码都会运行。有人知道发生了什么事吗 代码: 日志:If statement 在SAS中使用切换语句,if-statement,sas,toggle,If Statement,Sas,Toggle,我试图创建一个程序,根据用户输入打开或关闭代码的某些部分。下面的代码应该只在prog1变量设置为Y时运行。但是,我的日志显示,无论发生什么情况,代码都会运行。有人知道发生了什么事吗 代码: 日志: 您的代码中有一些错误。(在数据集中使用宏函数,在调用宏变量时滥用&(安培) 1) 始终使用&(安培数)调用宏变量 2) 添加一个点,如路径(&P)。必要时,如果&path宏变量后面有另一个字符串或宏变量。 3) 您更愿意使用带有%if、%then等的宏函数进行检查 您应该使程序更面向宏,如下所示: %
您的代码中有一些错误。(在数据集中使用宏函数,在调用宏变量时滥用&(安培) 1) 始终使用&(安培数)调用宏变量 2) 添加一个点,如路径(&P)。必要时,如果&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;
现在就行了
请注意,您的代码中有一些错误。(在数据集中使用宏函数,在调用宏变量时滥用&(安培) 1) 始终使用&(安培数)调用宏变量 2) 添加一个点,如路径(&P)。必要时,如果&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处理。因此,您编写了一个数据步骤,该步骤将有条件地跳过宏生成的SAS代码。但是宏本身将始终运行 如果将主程序编码为宏而不是打开SAS代码,则可以添加宏逻辑,如
%If
,以有条件地生成宏调用
或者对于这个简单的示例,您可以使用callexecute()
或其他代码生成方法来控制宏调用的生成。这样,如果条件为false,SAS将永远不会在输入流中看到宏调用
data _null_;
if "&prog1." = "Y" then do;
call execute('%nrstr(%findit)(&file1.)');
call execute('%nrstr(%findit)(&file2.)');
end;
run;
它在做你让它做的事。将首先计算宏引用和宏代码。然后,宏引用生成的任何SAS代码都将由SAS处理。因此,您编写了一个数据步骤,该步骤将有条件地跳过宏生成的SAS代码。但是宏本身将始终运行 如果将主程序编码为宏而不是打开SAS代码,则可以添加宏逻辑,如
%If
,以有条件地生成宏调用
或者对于这个简单的示例,您可以使用callexecute()
或其他代码生成方法来控制宏调用的生成。这样,如果条件为false,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_;
您的第二条if语句正在检查“prog2.”而不是“&prog2.”,并且在日志中,宏变量“&prog3.”是正在解析的变量,而不是&prog1。和&prog2 尝试将其添加到将所有用户宏变量打印到日志的代码中
%put _user_;
我尝试了这一点,但出现了一个错误,即%if语句在开放代码中无效。你是说要创建另一个宏并运行它吗?是的,在这里的解决方案中,你必须创建一个名为%check的新宏函数。否则,您将无法使用%if,%then。我尝试了此操作,但发现一个错误,说明%if语句在开放代码中无效。你是说要创建另一个宏并运行它吗?是的,在这里的解决方案中,你必须创建一个名为%check的新宏函数。否则,您将无法使用%if,%then。