If statement 在SAS中使用切换语句

If statement 在SAS中使用切换语句,if-statement,sas,toggle,If Statement,Sas,Toggle,我试图创建一个程序,根据用户输入打开或关闭代码的某些部分。下面的代码应该只在prog1变量设置为Y时运行。但是,我的日志显示,无论发生什么情况,代码都会运行。有人知道发生了什么事吗 代码: 日志: 您的代码中有一些错误。(在数据集中使用宏函数,在调用宏变量时滥用&(安培) 1) 始终使用&(安培数)调用宏变量 2) 添加一个点,如路径(&P)。必要时,如果&path宏变量后面有另一个字符串或宏变量。 3) 您更愿意使用带有%if、%then等的宏函数进行检查 您应该使程序更面向宏,如下所示: %

我试图创建一个程序,根据用户输入打开或关闭代码的某些部分。下面的代码应该只在prog1变量设置为Y时运行。但是,我的日志显示,无论发生什么情况,代码都会运行。有人知道发生了什么事吗

代码:

日志:


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

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。