문제
여러 위치에서 다른 인수를 사용하여 호출하려는 코드가 있습니다.
해결책
매개 변수, 지역 변수를 사용하여 다른 코드와 분리하고 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()는 두 개의 6면체 주사위를 사용합니다. RollDice(3)는 6면체 주사위 3개를 사용하고, RollDice(1,7)는 7면체 주사위 1개를 사용합니다.
function의 두 번째 인수는 초기 값을 가질 수 있는 지역 변수의 선택적 목록입니다. 로컬 값을 사용하면 함수가 다른 함수를 호출하도록 할 수 있으며 for 루프에서 "i"를 재사용하는 것에 대해 걱정할 필요가 없습니다. 지역 변수를 지정할 필요가 없다면 함수 본문을 세 번째 인수가 아닌 두 번째 인수로 넣으면 됩니다.
마지막 인수(두 번째 또는 세 번째)는 함수 본문입니다. 필요한 경우 전역 값을 참조할 수 있습니다. 본문 어디에서나 return 문을 사용하여 호출자에게 다시 보낼 값을 지정할 수 있습니다. return 문이 없으면 마지막으로 실행된 문의 값이 반환됩니다.
RollDice 함수는 처음 정의될 때 실행되지 않습니다. 다음과 같은 인수를 사용하여 호출될 때 실행됩니다.
rollDice(3,6)
이 예는 열 수식에서 수행됩니다.
또한보십시오
http://www.jmp.com/support/help/Advanced_Programming_Concepts.shtml
@Craige_Hales
FWIW, 귀하의 예에서 기본값을 남겨 두셨다니 다행입니다.Function()에 대한 정보를 검색하던 중 이 게시물을 발견했는데, 매우 도움이 되었습니다!
감사해요! @유다
아마도 누락된 값에 대한 규칙을 만들고 누락된 값을 기본값으로 대체하는 if 문을 추가할 것입니다. RollDice( . , 5 ); 이는 아마도 함수의 기본값에 대한 두 개의 복사본을 의미할 것입니다.
기본값을 사용하는 데는 여러 가지 이유가 있으며 그 중 일부는 때로는 잘못된 이유일 수도 있습니다.
- 호출 코드를 더 짧게 만들기
- 나중에 한 곳에서 기본값을 변경할 수 있음
- 처음 출시된 후 기능이 변경되었기 때문입니다.
- ?
기본 매개변수는 이를 지정하는 것보다 빠르지 않을 수 있습니다(테스트되지 않은 추측). 기본값이 합리적인 코드 검토자가 기대하는 것과 같으면 더 좋아 보일 수 있습니다. 나중에 기본값을 변경하면 문제가 발생할 수 있습니다. 새로운 호출자에 대한 새 매개변수를 추가하고 이전 호출자를 건드리지 않는 것이 유용할 수 있습니다.
이 예에서는 기본값을 그대로 두었으면 좋았을 것입니다. 항상 코드를 더 쉽게 따라갈 수 있는 것은 아닙니다. 전동 공구!
감사합니다. @Craige_Hales .RollDice 함수를 호출할 때, 나는 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를 사용하려면 기본값이 아닌 값을 허용해야 합니까?