在SAS代码中嵌入SAS宏结果

Luk*_*lim 1 sas

我想在数据步骤中包含宏函数调用的结果.我可以间接地做到这一点,首先将宏函数输出分配给一个宏变量,然后在我的函数中使用该宏变量,但这看起来不太优雅.

data dataset_employee;
input name $ dept $;
  datalines;
  John Sales
  Mary Acctng
;
data dataset_employee;
input name $ dept $;
  datalines;
  John Sales
  Mary Acctng
;

data dataset_manager;
input name $ dept $;
  datalines;
  Will Sales
  Sue Acctng
;
Run Code Online (Sandbox Code Playgroud)

似乎SAS没有意识到宏调用已完成,我正在切换到常规SAS代码.

 /*this works*/
%let var = %DO_OVER(VALUES=employee, PHRASE=dataset_?) dataset_manager; 
data combined1;
  set &var dataset_manager;
run;

/*this fails*/
data combined;
  set %DO_OVER(VALUES=employee manager, PHRASE=dataset_?); 
  dataset_manager;
run;

/*this works*/
data combined;
  set dataset_manager %DO_OVER(VALUES=employee manager, PHRASE=dataset_?); 
  ;
run;
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我理解这里发生了什么?

DaB*_*dze 5

似乎失败的尝试是由于额外的; 在宏调用结束时.尝试删除它.

宏调用不需要分号.第一个示例在宏调用之后没有分号工作(请注意,您使用的是dataset_manager数据集两次,在%let中再次使用set语句).

即使你删除了两个分号中的一个(第一个例子需要结束set语句),第三个例子也可以工作.

  • 宏调用不需要分号.即使您删除了两个分号上的一个,您的第三个示例也会起作用.第一个例子是在宏调用之后没有使用分号(注意,你正在使用dataset_manager数据集两次,在%let中再次使用集合中). (5认同)
  • 请记住,宏(和宏变量)只是插入文本,就像您自己键入文本一样.只有在需要分号时才需要分号.大多数时候它们都是无害的,但在某些情况下(比如这个)它们不是. (2认同)