gpt4 book ai didi

sas - 在 SAS 中,执行没有分号的宏?

转载 作者:行者123 更新时间:2023-12-04 13:38:08 25 4
gpt4 key购买 nike

我在 SAS 中多次运行宏,如下所示:

%mymac(a,b);
%mymac(a,c);
.
%mymac(a,a)
%mymac(a,w);
.

我的程序/宏类似于:
/* begin program here */

data original_data;
set mylib.mydata;
run;

%macro mymac(x,y);

data mydata1;
set original_data;
where school_district="&x";
run;

proc means data=mydata1;
var income;
run;

%mend mymac;

我意识到我忘记了分号(如 (a,a) 中的分号),SAS 似乎并不介意。它运行所有宏调用没有问题。我在添加分号时比较了输出,但看不出有什么不同。

SAS 没有给出缺少分号的错误是否正常?

最佳答案

分号是 不是 宏调用所需。

通常它们被包括在内,因为人们习惯于将分号视为“终止语句”或结束行的一种方式。我个人更喜欢尽可能包含它们,因为我相信它使我的代码更具可读性。

请记住,宏只是评估自己并返回它们解析的任何内容,这可能是看起来像数字、字符串或其他任何东西的代码块......

以这个不使用分号的例子为例:

%macro field_list();
name,
age,
sex,
height
%mend;

proc sql;
select %field_list()
from sashelp.class
;
quit;

尝试使用 option mprint; 在您自己的机器上运行它启用。运行宏的结果只是返回其中的代码块。这将导致执行以下代码:
proc sql;
select name, age, sex, height
from sashelp.class
;
quit;

如果我们在调用宏之后有一个分号,那么 SAS 将尝试运行的代码将包含分号,这将是无效的语法,如下所示(注意高度后面的分号):
proc sql;
select name, age, sex, height ;
from sashelp.class
;
quit;

这是因为调用宏不需要分号,所以它只是被留下并包含在步骤的执行中。

当您像在上面给出的示例中那样调用宏时,可以包含分号,因为您的宏是一个完全独立的步骤。在开放代码中,像这样使用多余的分号并没有什么害处:
%macro example2(inDS=, outDs=);
data &outDs;
set &inDs;
run;
%mend;

%example2(inDS=sashelp.class, outDs=tmp_class);

这基本上评估为:
data tmp_class;
set sashelp.class;
run;;

注意到我们调用的末尾多余的分号了吗?我们可以拥有任意数量的代码,并且代码仍然可以正常运行,即:
%example2(inDS=sashelp.class, outDs=tmp_class);;;;;;

决议:
data tmp_class;
set sashelp.class;
run;;;;;;;

它仍然可以正常运行,因为它是有效的语法。

关于sas - 在 SAS 中,执行没有分号的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26490927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com