2017-03-06 6 views
0

私は2つの変数message_oneとmessage_twoを持っています。ループごとにループ変数に対応する変数を追加する

変数をループしている間、 "vari"がvaroneの場合はmessage_oneを表示し、 "vari"がvartwoの場合はmessage_twoを表示します。

私がしたいことは違っていますが、これは一例です。

私は以下のことを行っており、動作しません。

foreach vari in varone vartwo { 

local suffix "one" if `vari'==varone 
local suffix "two" if `vari'==vartwo 

display(message_`suffix') 

} 

ローカル回線を変更するにはどうすればよいですか。

つまり、ループごとにループ変数に対応する変数を追加します。

答えて

1

ifの条件はここでは機能しません。一般に、それは何らかの条件を満たす観測を識別する。特に、内容をマクロに割り当てる際には、暗黙的にループを監視する必要がないため、修飾としては意味がありません。localしたがって、あなたの構文の可能性のある結果は、不正な構文メッセージです(「動作しません」というのは決して正確な問題報告ではありません)。

しかし、

local foo if 2 == 2 

のようなものの効果はちょうど地元のマクロfooにテキストif 2 == 2をコピーすることであることに注意してください。

何がしたいことは、より

foreach vari in varone vartwo { 
     di cond("`vari'" == "varone", "one", "two") 
} 

ように、おそらくですが、単一の直接の文が足りるように、そのループは無意味です:

di "one" _n "two" 

あなたが代わりにこれを行うことができます:

foreach vari in varone vartwo { 
     if "`vari'" == "varone" di "one" 
     else di "two" 
} 

ここのifコマンドは、とはかなり異なります修飾子。

私はあなたがここで欲しいものを推測しなければなりませんでした。

まず、文字列を直接比較したいと思っていたことに二重引用符を追加しました。あなたが他のものを望むなら、説明してください。

第二に、

display(message_one) 

のような文はmessage_oneが事前定義された変数(あなたが最初の観測では、その値の表示を見ることになる場合)、または事前に定義されたスカラーた場合にのみ動作します。しかし、変数に単一のテキストメッセージを保存することは、スカラーを定義するための良い方法ではないのStataで

gen foo = "this message" 

のようなものとなりますように同じテキストは、すべての観測で繰り返される場合は特に、不要です。メッセージをプログラム内のリテラルテキスト文字列として定義することは、ほとんどの場合、ほとんどの場合、最も簡単で最善です。

あなたの質問は、あなたの本当の問題の最小限のバージョンであることは明らかですが、同様に私はその本当の問題が何であるか分かりません。

関連する問題