我不知道有什麼區別通過%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