数据步骤中宏变量的解析

时间:2018-10-02 12:17:46

标签: macros sas sas-macro datastep

我无法让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语句可以在开放代码中正常工作并执行。我只是很难让它在数据步骤中正确解析。

请让我知道您是否需要其他信息来帮助我解决这个问题。谢谢大家!

2 个答案:

答案 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)

  • SYMGET()将返回一个字符变量。
  • RESOLVE()将返回一个字符变量,但它需要参数中的&。
  • &log_flag将解析为数字

您需要根据参考方法正确对待它们。

下面是一个单独测试每个示例的示例,然后您可以根据需要通过嵌套一起对它们进行测试。

%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;