ㅏ 의문 ~에서 그리고 열 수식에 대해 이 게시물을 시작했습니다. 수식 편집기만 사용하여 열 수식을 만드는 경우 거의 모든 것을 무시할 수 있습니다. 이 게시물은 JSL을 사용하여 열 수식을 만드는 방법에 대한 것입니다.
먼저 Formula 명령에 대해 조금 알아보겠습니다. 다음은 정말 간단한 것입니다.
The formula for column C adds columns A and BThe formula for column C adds columns A and BThe formula for column C adds columns A and BThe formula for column C adds columns A and B열 C에 대한 수식은 열 A와 B를 추가합니다.
테이블 스크립트(왼쪽 상단 삼각형->테이블 스크립트 복사, 편집기에 붙여넣기)는 다음과 같습니다.
New Table( "abc", Add Rows( 2 ),
New Column( "a", Numeric, "Continuous",Format( "Best", 12 ),Set Values( [1, 7] )),
New Column( "b",Numeric,"Continuous",Format( "Best", 12 ),Set Values( [2, 9] )),
New Column( "c", Numeric, "Continuous", Format( "Best", 12 ),
Formula( :a + :p</img> )
)
)
5행은 공식을 설정합니다. 수식은 열과 b를 추가하는 표현식입니다. 식은 나중에 실행되지 않습니다. 표현식은 열의 일부로 표현식으로 저장됩니다. 다른 행이 테이블에 추가되거나 열 a 또는 b의 값이 변경되면 표현식을 다시 평가하여 열 c의 값을 얻을 수 있습니다.
이것은 친절하고 비정상적인 행동입니다. 대부분의 함수가 인수를 평가하기 때문에 비정상적입니다. sqrt( 4 + 5 )는 3을 반환합니다. 열에 할당되기 전에 JMP가 열의 공식을 평가하는 것을 거의 원하지 않기 때문에 친숙합니다.
때로는 공식 표현식이 정말 복잡할 수 있습니다. 너무 복잡하면 표현식을 작성하는 프로그램을 작성하는 것이 더 쉬울 것입니다. 수식 명령에서 이를 수행하려면 수식 명령에 인수를 미리 평가하고 결과 표현식을 수식으로 사용하도록 지시하는 방법이 필요합니다. 사전 평가할 코드 주위에 eval( ) 래퍼를 추가하면 됩니다. 수식 명령이 식을 둘러싸고 있는 "eval"을 보면 코드를 실행하고 결과를 사용합니다.
lookup = function({t,u}, expr(a+b) );
New Table( "abc",
Add Rows( 2 ),
New Column( "a",Numeric,"Continuous",Format( "Best", 12 ),Set Values( [1, 7] )),
New Column( "b",Numeric,"Continuous",Format( "Best", 12 ),Set Values( [2, 9] )),
New Column( "c", Numeric, "Continuous", Format( "Best", 12 ),
Formula( eval( lookup(1,2) ) )
)
)
사용자 정의 "조회" 기능(1행)은 그다지 밝지 않지만 반환된 값으로 expr(a+b)를 검색하려면 실행해야 합니다. 7행에서 eval() 래퍼는 열 수식이 "lookup(1,2)"로 설정되지 않고 대신 lookup(1,2)에 의해 반환된 표현식으로 설정됨을 의미합니다.동일한 열 수식을 사용하여 이전과 동일한 테이블입니다.
열 수식을 eval()로 시작하는 표현식으로 설정하려면 어떻게 하시겠습니까?eval()로 시작하는 것은 인수를 평가하고 결과를 사용하는 것을 의미하기 때문에 Formula 명령이 어떻게 그렇게 할 수 있습니까? (흥미로운 예를 찾기가 어려웠지만, MS 질문의 답변에 하나가 있습니다.) 답변은 Name Expr( )입니다. 이름 Expr은 일반적으로 평가하지 않고 JSL 변수에서 표현식을 가져오는 데 사용되는 JSL 함수입니다. 수식 명령의 가장 바깥쪽 래퍼로서, 평가하지 않고 인수만 반환합니다. 첫 번째 예는 다음과 같은 설명을 제외하고는 정당한 이유 없이 이를 사용하여 정확히 동일한 테이블을 반환할 수 있습니다.
New Table( "abc", Add Rows( 2 ),
New Column( "a", Numeric, "Continuous",Format( "Best", 12 ),Set Values( [1, 7] )),
New Column( "b",Numeric,"Continuous",Format( "Best", 12 ),Set Values( [2, 9] )),
New Column( "c", Numeric, "Continuous", Format( "Best", 12 ),
Formula( Name Expr( :a + :p</img> ) )
)
)
이 아니라면 MS 예를 들어 eval을 영리하게 사용하기 때문에 필요합니다(아마도 다른 블로그 게시물에서 그것이 하는 일을 설명하기를 원할 것입니다). 다음은 원래 질문의 최종 테이블입니다. 두 번째 공식 열로 내 아이디어를 추가했습니다.
New Table( "final?",Add Rows( 9 ),
New Column( "color",Character,"Nominal",
Set Values({"green", "green", "blue", "yellow", "red", "red", "yellow", "green", "green"})),
New Column( "count",Numeric,"Continuous",Format( "Best", 12 ),
Formula( Name Expr( Eval( Eval Expr( Col Sum( Row() <= Expr( Row() ), :color ) ) ) ) )),
New Column( "another count",Numeric,"Continuous",Format( "Best", 12 ),
Formula(
n = 0;
For( i = 1, i <= Row(), i++,
If( :color == :color[i], n++ )
);
n;
)
)
);
세 번째 열의 공식은 마지막 일치 항목을 거꾸로 보고 해당 개수에 1을 추가하여 명확성을 희생시키면서 더 빠를 수 있습니다. 명확성 대 효율성은 절충점입니다.

따라서 이 프로세스에서 발견된 버그를 수정하기 위해 출발합니다. 데이터 테이블이 자체를 재현하는 스크립트를 생성할 때(위의 예와 같이), 열 수식도 재현하기 위해 JSL을 생성해야 합니다. 열 공식이 특수 eval( ) 래퍼로 시작하고 평가가 공식의 일부인 경우 JMP는 Name Expr을 추가해야 합니다.
2018년 4월 21일 업데이트: 이전 블로그에서 자동 변환을 복구합니다.