proc Luaの世界⑥proc Luaとマクロ変数のカンケイ

珍しく記事連続投稿です。
一つ前の記事「パラメータマクロでやっていた処理をLuaで組むのはどういう感じななのか?の話」
http://sas-tumesas.blogspot.jp/2016/10/lua.html
も是非読んでもらえると嬉しいです。

僕は、処理をまるごとマクロにしてパラメータ与えて実行するマクロは、基本的にLuaで置き換えることができるし、そちらの方が良いと思っています。
%macroをSASコードから1行残らず駆逐してやる!とまでは思わないですが、マクロ一党支配の現状はちょっと変えていきたいですね。何年かかるかわかりませんが。

そんな%macroあんまり好きでない僕ですが、マクロ変数の仕組みは割と好きです。シンプルで強力なテキスト展開なので、、。

今日はProc Lua内でマクロ変数の値を取得する&Proc Lua内でマクロ変数を作成する話です。

さて、今、ふたつのマクロ変数を作ります。

%let m1=I;
%let m2=SAS;

通常、SASコード内に「&マクロ変数名」があると実行時に展開されますが、
以下のコードを実行してみると

proc lua restart;
submit;
print("&m1".. " love ".. "&m2")
endsubmit;
run;


はい、結果はこんな感じです




ダブルコーテーション使ってるのに&のままです。
proc luaの中は、鉄壁の不可侵領域で、一切マクロ変数の展開はおきません。
この仕様、僕は大好きですね。変にクォート処理とかに頭使わなくていいので気が楽です。

じゃあ、proc lua内にマクロ変数持ち込めないんですか?って話になりますけど
もちろんそんなわけないです。

ひとつは、普段のデータステップでもおなじみのsymget関数を使う。

proc lua restart;
submit;
print(sas.symget("m1").. " love ".. sas.symget("m2"))
endsubmit;
run;

結果は




或いは、以下のように

proc lua restart ;
submit "m1='&m1'; m2='&m2'";
print(m1 .. " love " .. m2)
endsubmit;
run;

submitの後のコーテーションの中で
割り当てることにより、Luaのローカル変数にマクロ変数の値を渡せます。
テキストとして渡したいので'&m1'と、コーテーションでくくっていることに注意です。

もしコーテーションでくくらずに、文字を渡した場合、それ自体がLuaの変数を指定していると
みなされるので、例えば以下のようなこともできます

proc lua restart;
submit;
I='YOU'
SAS=' LOVE Lua'
endsubmit;
run;
proc lua;
submit "m1=&m1;m2=&m2";
print(m1 .. m2)
endsubmit;
run;




ちなみにちょっと注意ですが、Proc Lua内ではマクロ変数の展開はおきませんが


proc lua restart;
submit;
sas.submit([[data _null_;
put "&m1 love &m2";
run;
]])
endsubmit;
run;

のようにsas.submitで実行されるSASコードは、実行前に通常と同じくマクロ変数の展開がおきますからね


さて、次は、Lua内でマクロ変数に値をいれる話ですが、簡単なのでさらりと


proc lua restart;
submit;
local x = 1+2+3
local y = 'aaa'

sas.symput('_x',x)
    sas.symput('_y',y)

endsubmit;
run;

%put &_x;
%put &_y;

要はsas.symputでいけるという話です。

なので、データセットのオブザベーション数や変数数をマクロ変数に取得するのも超簡単

proc lua;
submit;
      local dsid = sas.open("sashelp.class")
      local nobs = sas.nobs(dsid)
sas.symput('obs',nobs)
  local nvars = sas.nvars(dsid)
      sas.symput('vars',nvars)
      sas.close(dsid)
endsubmit;
run;

%put オブザベーション数は &obs;
%put 変数の数は &vars;

です

やっぱProc Lua楽しいですね


0 件のコメント:

コメントを投稿