我无法让If / Then语句在数据步骤中与宏变量一起正常工作。我正在编写一个宏来处理两种不同的情况:计算无转换的统计测试,然后在自然对数转换后计算统计测试。如果我的数据未通过正常性测试,则记录转换并再次测试。如果通过,则将我的全局标志log_flag
设置为1。然后,我想在数据步骤中测试该标志的状态,以便正确处理已转换(或未转换)的变量。我尝试了以下几种方法:
Data want;
set have;
if symget("log_flag")=1 then do;
if &log_flag. = 1 then do;
if resolve("log_flag")=1 then do;
test=symget("log_flag");
if test=1 then do;
end
无论我尝试什么,本质上都会忽略if / then语句,并且即使if / then为false,也将处理其后的所有代码,就好像if / then为true。我知道log_flag
被正确赋值为零,因为%if
%then
语句可以在开放代码中正常工作并执行。我只是很难让它在数据步骤中正确解析。
请让我知道您是否需要其他信息来帮助我解决这个问题。谢谢大家!
答案 0 :(得分:2)
您在注释中发现的问题是,您根本不想生成SAS代码。那就是宏语言处理器的作用。因此,使用%IF
有条件地生成代码。
因此,如果您只想在宏变量newvar
为1时创建变量log_flag
,则可以用这种方式进行编码。
data want ;
set have ;
%if &log_flag. = 1 %then %do;
newvar= x*y ;
%end;
run;
因此,当&log_flag. = 1
时,您将运行以下代码:
data want ;
set have ;
newvar= x*y ;
run;
如果不是,则运行以下代码:
data want ;
set have ;
run;
从SAS 9.4 M5版本开始,您可以在开放代码中使用它,否则将其放在宏定义中并执行该宏。
答案 1 :(得分:0)
您需要根据参考方法正确对待它们。
下面是一个单独测试每个示例的示例,然后您可以根据需要通过嵌套一起对它们进行测试。
%let log_flag=1;
Data want;
set sashelp.class;
if symget("log_flag")='1' then do;
put "Test #1 is True";
end;
if &log_flag. = 1 then do;
put "Test #2 is True";
end;
if resolve("&log_flag")="1" then do;
put "Test #3 is True";
end;
test=symget("log_flag");
if test='1' then do;
put "Test #4 is True";
end;
run;