繁体   English   中英

数据步骤中宏变量的解析

[英]Resolution of Macro Variables in a Data Step

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

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

您在注释中发现的问题是,您根本不想生成SAS代码。 那就是宏语言处理器的作用。 因此,请使用%IF有条件地生成代码。

因此,如果您只想在宏变量log_flag为1时创建变量newvar ,则可以采用这种方式进行编码。

data want ;
  set have ;
%if &log_flag. = 1 %then %do;
  newvar= x*y ;
%end;
run;

因此,当&log_flag. = 1 &log_flag. = 1您运行以下代码:

data want ;
  set have ;
  newvar= x*y ;
run;

如果不是,则运行以下代码:

data want ;
  set have ;
run;

从SAS 9.4 M5版本开始,您可以在开放代码中使用它,否则将其放在宏定义中并执行该宏。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM