2

我不知道有什么区别

%let m=product 和 cal symput('m', 'product') 是?

不是两个表达式都创建了具有值乘积的 af 宏变量 m 吗?

4

3 回答 3

8

%let用于定义基于文本或解析为文本的表达式的宏变量。它在开放代码或宏中调用。 %let自动修剪前导和尾随空白的宏变量。文档可以在这里找到。

call symput此处的文档)用于分配 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将执行相同的操作,除非您指定一个可选参数来指示您希望放置哪个表。

于 2013-06-21T18:59:36.060 回答
3

唯一的区别是调用%LETor的方法call symput

%LET在开放代码中使用,而不是在数据步或过程中使用。

call symput在数据步内使用,而不是在开放代码中使用。

于 2013-06-21T07:41:08.597 回答
0

%let 是一个宏语句,您可以在开放代码或宏内部使用。呼叫症状只能在 DATA 步中使用,不能在开放代码中使用。请注意,此 DATA 步可能在宏中。

至于创建的变量的作用域,请看:

http://www.lexjansen.com/phuse/2009/po/PO15.pdf

于 2015-11-15T22:16:34.727 回答