問題
おそらく異なる引数を使用して、複数の場所から呼び出したいコードがあるとします。
解決
ユーザーが作成した関数を、パラメーター、他のコードから遠ざけるためのローカル変数、および応答を送り返すための return ステートメントを使用して使用します。
// this example shows how to write a user written function to roll
// ndice with nsides
// a user written function is created with an assignment statement
// to a variable that will be the name of the function. rollDice
// seems a good name to explain what this function does.
rollDice = Function( {ndice = 2, nsides = 6}, // parameters
{i, sum = 0}, // local variables
For( i = 1, i <= ndice, i++, // loop to add up the rolls
sum += Random Integer( 1, nsides ) // one roll
); // end of the loop
Return( sum ); // value to return
); // end of the definition
// make table and distributions. the number of dice
// and the number of sides is chosen to make the
// average roll be 36
dt = New Table( "Untitled",
Add Rows( 10000 ),
// each column has a formula that calls the function...
New Column( "one", Formula( rollDice( 1, 71 ) ) ),
New Column( "two", Formula( rollDice( 2, 35 ) ) ),
New Column( "three", Formula( rollDice( 3, 23 ) ) ),
New Column( "four", Formula( rollDice( 4, 17 ) ) )
);
// check the Std Dev in the 4 reports...
// it gets smaller with more dice
dt << Distribution(
Continuous Distribution( Column( :one ) ),
Continuous Distribution( Column( :two ) ),
Continuous Distribution( Column( :three ) ),
Continuous Distribution( Column( :four ) ),
SendToReport(
Dispatch( {"one"}, "Distrib Histogram", FrameBox, {DispatchSeg( Hist Seg( 1 ), Bin Span( 24, 0 ) )} ),
Dispatch( {"two"}, "Distrib Histogram", FrameBox, {DispatchSeg( Hist Seg( 1 ), Bin Span( 24, 0 ) )} ),
Dispatch( {"three"}, "Distrib Histogram", FrameBox, {DispatchSeg( Hist Seg( 1 ), Bin Span( 24, 0 ) )} ),
Dispatch( {"four"}, "Distrib Histogram", FrameBox, {DispatchSeg( Hist Seg( 1 ), Bin Span( 24, 0 ) )} )
)
);<BR />
More dice, smaller standard deviationMore dice, smaller standard deviationサイコロの数が増えるほど、標準偏差は小さくなります
議論
Function() 関数は関数を返します。 Function() の最初の引数はパラメータのリストであり、必須です。 パラメータがない場合は、{} を使用します。 パラメータには、上に示したデフォルト値を設定できます。 rollDice() は 2 つの 6 面ダイスを使用します。 rollDice(3) は 3 つの 6 面ダイスを使用し、rollDice(1,7) は 1 つの 7 面ダイスを使用します。
function の 2 番目の引数は、初期値を持つことができるローカル変数のオプションのリストです。 ローカル値を使用すると、関数で他の関数を呼び出すことができ、for ループでの「i」の再利用を心配する必要がなくなります。 ローカルを指定する必要がない場合は、関数本体を 3 番目の引数ではなく 2 番目の引数として指定するだけです。
最後の引数 (2 番目または 3 番目) は関数の本体です。 必要に応じてグローバル値を参照できます。 本文の任意の場所で return ステートメントを使用して、呼び出し元に送り返す値を指定できます。 return ステートメントがない場合は、最後に実行されたステートメントの値が返されます。
関数 rollDice は、最初に定義された時点では実行されません。 次のように引数を指定して呼び出されたときに実行されます。
rollDice(3,6)
この例では列の式でこれを行っています。
関連項目
http://www.jmp.com/support/help/Advanced_Programming_Concepts.shtml
@Craige_Hales
FWIW、例ではデフォルト値をそのままにしておいてよかったです。Function() に関する情報を探していたときにこの投稿を見つけました。これは非常に役に立ちました。
ありがとう! @ユダ
おそらく、欠損値のルールを作成し、欠損値をデフォルトに置き換える if ステートメントを追加するでしょう。 rollDice( . , 5 );これはおそらく、関数内のデフォルト値のコピーが 2 つあることを意味します...
デフォルト値を使用する理由はいくつかありますが、場合によってはそれらのうちのいくつかは悪い理由である可能性があります。
- 呼び出しコードを短くする
- 後でデフォルトを 1 か所で変更できる
- 最初に公開された後に機能が変更されたため
- ?
デフォルトのパラメータは、おそらく、パラメータを指定するより速くはありません (未テストの推測)。デフォルト値が、合理的なコードレビュー担当者が期待するものであれば、見た目は良くなるかもしれません。 後でデフォルトを変更すると、何かが壊れる可能性があります。 新しい呼び出し元に新しいパラメータを追加し、古い呼び出し元には触れないようにすると便利な場合があります。
この例ではデフォルト値を残しておけばよかったと思うかもしれません。必ずしもコードを理解しやすくするわけではありません。 パワーツール!
ありがとうございます。 @Craige_Hales 。rollDice 関数を呼び出すとき、i ndice のデフォルト値を渡さずに、ndice をデフォルト値と等しく保ち、nsides をデフォルト以外の値に設定する方法はありますか?
例えば:
ndice = 3、nsides = 5 ==> rollDice( 3, 5 )
ndice = 3、nsides = 6 (デフォルト値) ==> rollDice( 3 )
ndice = 2 (デフォルト値)、nsides = 5 ==> rollDice( ?? )
もちろん、 ndice を指定することもできます ( rollDice( 2, 5 ) ) が、 nsides にデフォルト以外の値を使用できるようにする必要がありますか?