0

という名前の .ado ファイルを使用していますflow。ユーザーが入力した場合、flow i1 つのifステートメントを実行します。ユーザーがflow eを入力した場合、別のifステートメントを実行します。

どうすればいいですか?

4

3 に答える 3

3

このフォーラムの多くの読者は、あなたが試したコード を見ることを期待しています....

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を入力したことはすでに確立されているため、最後の条件は冗長です。好みに合わせて編集してください。ei

于 2013-10-25T09:31:00.857 に答える
2

@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 によるコマンドでは必要ありません)。

于 2013-10-25T10:42:27.650 に答える
1

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 コマンドにヘルプ ファイルが付属していることを前提としています。一部のプログラマーは、ヘルプ ファイルで構文が説明されていると想定して記述します。他の人は、エラーメッセージができるだけ役立つことを望んでいます。

于 2013-10-25T12:43:16.343 に答える