という名前の .ado ファイルを使用していますflow
。ユーザーが入力した場合、flow i
1 つのif
ステートメントを実行します。ユーザーがflow e
を入力した場合、別のif
ステートメントを実行します。
どうすればいいですか?
という名前の .ado ファイルを使用していますflow
。ユーザーが入力した場合、flow i
1 つのif
ステートメントを実行します。ユーザーがflow e
を入力した場合、別のif
ステートメントを実行します。
どうすればいいですか?
このフォーラムの多くの読者は、あなたが試したコード を見ることを期待しています....
program flow
version 8 // will work on almost all Stata in current use
gettoken what garbage : 0
if "`what'" == "" | "`garbage'" != "" | !inlist("`what'", "e", "i") {
di as err "syntax is flow e or flow i"
exit 198
}
if "`what'" == "e" {
<code for e>
}
else if "`what'" == "i" {
<code for i>
}
end
ユーザーがorif
を入力したことはすでに確立されているため、最後の条件は冗長です。好みに合わせて編集してください。e
i
@NickCox の回答に対するコメントを考えると、次のようなことを試したと思います。
program flow
version 8
syntax [, i e]
if "`i'`e'" == "" {
di as err "either the i or the e option needs to be specified"
exit 198
}
if "`i'" != "" & "`e'" != "" {
di as err "the i and e options cannot be specified together"
exit 198
}
if "`e'" != "" {
<code for e>
}
if "`i'" != "" {
<code for i>
}
end
その後、次flow
のように呼び出します:flow, i
またはflow, e
. コンマに注意してください。これは、オプションにしたため、必要になりました (ただし、@NickCox によるコマンドでは必要ありません)。
i
とを相互に排他的なオプションにしたい場合e
、これはさらに別の選択肢です。
program flow
version 8
capture syntax , e
if _rc == 0 { // syntax matched what was typed
<code for e>
}
else {
syntax , i // error message and program exit if syntax is incorrect
<code for i>
}
end
各ブランチのコードが長い場合、スタイルの問題として各ケースのサブプログラムを好む人が多いですが、それはここのスケッチと一致します。syntax
各ステートメントで、オプションが必須であると宣言されていることに注意してください。
の効果capture
は次のとおりです。エラーは致命的ではありませんが、 によって「食べられます」capture
。そのため、 でアクセスできる戻りコードを確認する必要があります_rc
。常に0 は_rc
、コマンドが成功したことを意味します。ゼロ以外は常に、コマンドが失敗したことを意味します。ここで、そして他の多くの場合、コマンドが正しい方法は 2 つしかないため、何_rc
があったかを知る必要はありません。他の正当な構文をチェックする必要があるだけです。
ここでの私の 2 つの回答でさえ、ユーザーが不正なコマンドを入力すると有益なエラー メッセージが表示されるか、単に「無効な構文」が表示されるかによってスタイルが異なることに注意してください。これに対するコンテキストは、すべての Stata コマンドにヘルプ ファイルが付属していることを前提としています。一部のプログラマーは、ヘルプ ファイルで構文が説明されていると想定して記述します。他の人は、エラーメッセージができるだけ役立つことを望んでいます。