我不知道有什么区别通过%let定义SAS宏变量与调用symput之间的区别?
%令M =产品和 CAL symput之间( 'M', '产品')是什么?
这两个表达式是不是都创建了af宏变量m,它具有产品的价值?
我不知道有什么区别通过%let定义SAS宏变量与调用symput之间的区别?
%令M =产品和 CAL symput之间( 'M', '产品')是什么?
这两个表达式是不是都创建了af宏变量m,它具有产品的价值?
唯一的区别是用于调用任一%LET
或call symput
的方法。
%LET
在开放代码中使用,而不是一个或datastep PROC内。
call symput
使用datastep内,而不是在开放代码。
%let
用于定义基于文本的宏变量或解析为文本的表达式。它在开放代码或宏中被调用。 %let
自动修剪前导空白和尾随空白的宏变量。文档可以在here找到。
call symput
(文档here)用于分配SAS数据集变量的内容,解析为SAS数据集变量(或PDV变量)的表达式,字符值或解析为字符值的表达式(包括一个数字值,该数值在默认格式下解析为相同的字符,通常为BEST12。)。 call symput
确实不修剪前导和尾随空白,因此,例如表达
%let x=5;
%put [&x];
给你一个稍微不同的结果比表达
data _null_;
call symput('y',5);
run;
%put [&y];
call symputx
(自9.2可用)具有更类似的结果%let
,因为它修剪前导和尾随空白。这对于从数字创建的宏变量特别有用,因为它们通常有几个前导空格,就像上面的例子。
%let
和call symput\symputx
也有作用域一些差异。在开放代码中使用(或者数据步骤不在宏中)时,都会将宏变量放在全局表中,但宏中使用的%let
会将该变量放在已存在的最本地表中(如果存在);即如果你有一个global
变量&myvar
那么%let myvar=5;
将修改全局变量&myvar
,而不是创建一个本地作用域变量。 call symput
将把变量放置在最本地的非空符号表中,而不管它是否已经存在于全局范围内。 call symputx
也会这样做,除非您指定一个可选参数,指出希望放置哪个表。
%let是可以在开放代码或宏内使用的宏语句。呼叫症状只能在DATA步骤中使用,而不能在开放代码中使用。请注意,这个DATA Step可能在宏里面。
至于创建的变量的范围,请参阅:
好,非常感谢! – user1626092