2016-05-19 4 views
2

私はPDVがさえ作成される前に、マクロが解決されることを理解することができます。しかし、私は本当にこのコードからどのように把握することはできません。SASマクロフロー説明

data ds; 
    input id name $ value ; 
    datalines; 
    1 pluto 111 
    2 paperino 222 
    3 trump 333 
    4 topo 444 
    5 pippo 555 
    ; 
run; 


%macro test(var)/mindelimiter=','; 


    if &var = "pippo"n then in0_&var. = name; 
    else out0_&var. = name; 


%mend test; 

data want; 
    set ds; 
    %test(pippo); 
    %test(arj); 
    %test(frank); 
    %test(pluto); 
    %test(george); 
run; 

私はこの出力にenter image description here

を取得誰かがこのプロセスの内部ロジックを説明することができますか?

+0

"&var" = "pippo" n then ...ここで文字列を比較したいからです。これは少なくとも空の名前列を削除します...今はpippo、arj、...と呼ばれる変数を探し、文字列 "pippo"と比較しますn – kl78

+0

アウトを理解することはできません。出力は入力とまったく同じです。どのような場合でも、メソッドや関数を呼び出すpythonプログラムのように私は "out_&var"だけを期待しています。列名はありますが、もっと多くの列がありますが、実際にはどこから来たのかはわかりません。 – arj

+0

私はあなたが何をしようとしているのか分かりません。それらの瞬間、あなたのデータセットのすべての行に対して、異なる名前のマクロを5回呼び出します。出力は私が期待する通りです。あなたは何が結果を期待しましたか? – kl78

答えて

2

あなたのコメントを理解する限り、結果は4列、ID、名前の出入りを想定しており、常に出入りするだけの値があります。

しかし、すべての行に対してマクロを5回呼び出すとします。すべての行に対して1回だけ呼び出す必要があります。次に、期待される結果が得られます。あなたはここで、変数ではなく、コメントで作業しているので、私は、私のコメントで述べた「時」& VAR」(私のコードを修正)datastep内部

変数を削除する必要があり、その場合には

これで、前に行ったやり方でマクロを呼び出したすべての名前に対して、inとoutvariableを作成しました。これを避けるには、マクロif-elseの場合、真である節のみがデータストアに表示されるため、eG:

%if "&var" = "pippo"n %then in0_&var = name; 
%else out0_&var = name; 

しかし、変数 "name"の値がマクロコンパイラに認識されていないため、varを変数として使用する必要があります。これは、nameの変数値の代わりにin0_nameを取得するためです。

macrovariableの使い方を慎重にする必要があります。データストア内で文字列として使用する必要がある場合は、 "& var"を使用する必要があります。それ以外の場合は変数として解釈されます。

マクロはすべてmacrovalueで&の値を解決します。この後、datastepsはステップを解釈します。 したがって、この場合には、あなたは、マクロを必要としない、あなただけ例えば、代わりにあなたのmacrocallのdatastepでのif-elseを使用することができます。

data want; 
set ds; 
if name = "pippo"n then in0 = name; 
else out0 = name; 
run; 

彼らは道あなたがそれをしたい、あなたはこれを使用する必要があります

%macro test(var)/mindelimiter=','; 
if &var = "pippo"n then in0 = name; 
else out0 = name; 


%mend test; 

data want; 
set ds; 
%test(name); /*This is called for every row in your dataset, so if you have 5 macrocalls, 
they will be called 5 times for every row in your dataset*/ 
run; 
+0

ありがとうございました。より明確になっています。あともう一つだけ。私はそれぞれの名前の列を期待しています。 "in_name"のようなものです。ここでnameは自分のデータセットのセルの値です。とにかく偉大な答え私は完全にマクロと変数の使用法を理解するために深くそれを勉強する必要があります。 – arj

+0

@arj:Hm、これは、変数名の値がマクロコンパイラに認識されないため、マクロを文字列で呼び出さなければならないという問題があります。どちらの文字列を使うべきかを知っているなら、_n_ = 1、%test(pippo)のようなものを使うことができます。もし_n_ = 2ならば%test(arj)...そして私の答えに記述したマクロ内のelse-elseを使ってください。 – kl78

+0

素晴らしい!私はこの記事を今後何度もチェックします。どうもありがとう。 – arj

1

定義したとおりのマクロがある場合。

%macro test(var); 
if &var = "pippo"n then in0_&var. = name; 
else out0_&var. = name; 
%mend test; 

そして、あなたはそれがコード生成します値pippoにパラメータvarセットでそれを呼び出しますので、(このコードはpippoの値にpippoの値を比較していることを

if pippo = "pippo"n then in0_pippo = name; 
else out0_pippo = name; 

お知らせ名前リテラルを使用しています)。それはいつも真実です。したがって、常にの値にIN0_PIPPOを設定し、OUT0_PIPPOに値を割り当てません。

varという別の値(FRANKなど)を呼び出すと、その変数の値がPIPPOと比較されます。

このマクロを呼び出すサンプルデータステップでは、pippoまたはfrankという名前の変数はありません。そのため、参照するときに、SASは値のない新しい変数を作成します。だから彼らはいつも等しいでしょう。したがって、INO ...変数のすべてがNAMEの値に設定され、OUT0 ...変数のすべてが割り当て解除されます。

あなたが投稿した写真は、SASがあなたにしたことを正確に行ったことを示しています。