JMP 13용 JSL 매트릭스/목록 프로그래밍 변경 사항다른 행렬(또는 목록)을 사용하여 행렬(또는 목록)에 인덱싱하는 것은 스크립트를 빠르고 작게 만드는 강력한 기술이지만 JMP 13에서 수정하고 있는 문제가 하나 있습니다. 모든 변경 사항은 잠재적인 혼란이기 때문에 "고정"을 인용 부호로 묶어야 할 것 같습니다. 그래서 JMP 13이 출시되기 전에 여기에서 설명하고자 합니다.
다음은 행렬을 데이터 열에 대한 인덱스로 사용하는 예입니다.
Open("$SAMPLE_DATA/Big Class.jmp");
tall rows = Loc(:height << Get Values() >= 67); // [25, 27, 30, 37, 39, 40]
:height[tall rows]; // [68, 69, 67, 68, 68, 70]
N Rows(:height[tall rows]); // 6
이 스타일의 프로그래밍에 익숙하지 않다면 두 번째 줄이 핵심입니다. " :높이 << 값 가져오기() "는 높이 열의 값을 행렬로 반환합니다. 비교 " >= 67 "는 식이 거짓(0) 또는 참(1)인 위치에 해당하는 0과 1의 행렬을 반환합니다. 그만큼 위치() 함수는 이전 행렬 내에서 1의 위치를 반환합니다.
이 경우 높이 열이 67보다 크거나 같은 행 번호로 [25, 27, 30, 37, 39, 40]을 얻습니다. 그것은 그 자체로 매우 편리하지만 세 번째와 네 번째 줄에서와 같이 열이나 다른 행렬에 대한 인덱스로 해당 행렬을 사용할 수 있다는 것이 진정한 힘입니다.
이 기술에 대한 대안은 For() 루프를 작성하여 모든 행을 명시적으로 반복하는 것입니다. 물론 JMP는 두 경우 모두 여전히 행을 반복하지만 JSL이 아닌 내부에서 수행하는 것이 훨씬 빠릅니다. 그리고 JSL은 명시적 루프가 없으면 더 간결합니다.
데이터 열 참조 대신 행렬 변수로 동일한 작업을 수행할 수 있습니다.
m = :height << Get Values();
tall rows = Loc(m >= 67); // [25, 27, 30, 37, 39, 40]
m[tall rows]; // [68, 69, 67, 68, 68, 70]
N Rows(m[tall rows]); // 6
지금까지 모두 훌륭했습니다. 높이 컷오프가 다른 동일한 예를 살펴보겠습니다(67 대신 70).
tall rows = Loc(:height << Get Values() >= 70); // [40]
:height[tall rows]; // [70]
N Rows(:height[tall rows]); // 1
m = :height << Get Values();
tall rows = Loc(m >= 70); // [40]
m[tall rows]; // 70
N Rows(m[tall rows]); // error
무엇이 잘못되었나요? data[tall rows]가 [70] 대신 70을 반환했음을 알 수 있습니다. 많은 경우에 1x1 행렬과 숫자는 같은 방식으로 취급되지만 항상 그런 것은 아닙니다. N Rows() 함수는 차이를 만드는 한 가지 예입니다. 인덱싱이 너무 적극적으로 1x1 행렬을 숫자로 "단순화"하고 있습니다.
한 가지 해결 방법은 전화하는 것입니다. 매트릭스() 사용하기 전에 N 행() . 또 다른 방법은 빈 행렬을 결과에 연결하여 소스가 숫자인지 행렬인지에 관계없이 행렬을 만드는 것입니다.
m = m |/ [];
JMP 13에서는 1x1 행렬이 유지되므로 인덱스 연산의 결과는 인덱스 자체가 행렬일 때마다 행렬이 됩니다. . 목록 인덱싱에도 동일하게 적용되며 데이터 열 인덱싱에도 이미 적용되었습니다.
트리거가 일반적이지 않고 1x1 행렬과 숫자가 어쨌든 동일하게 취급되는 경우가 많기 때문에 중단이 드물 것으로 예상됩니다. 그럼에도 불구하고 JMP 13 디버거는 스크립트에서 변경 사항의 영향을 받을 수 있는 위치를 식별할 수 있습니다.
의견이나 우려 사항이 있는 경우 여기에서 알려주거나 연락하십시오. 다니엘 발렌테 JMP 13 얼리 어답터 프로그램에 대한 자격이 있는지 확인하여 자신의 코드에 변경 사항을 적용해 보십시오.
Re: JMP 13의 JSL 매트릭스/목록 프로그래밍 변경 사항디버거에서 중단 경고를 끄려면 어떻게 해야 합니까?재생을 계속해서 클릭해야 하는데 프로파일러가 작동하지 않는 것 같습니다.그냥 막혀서 더 이상 재생을 누를 수 없습니다.
*편집* 신경쓰지 마세요.나는 그것에 대한 옵션을 찾았습니다.감사
Re: JMP 13의 JSL 매트릭스/목록 프로그래밍 변경 사항<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />균일한 인덱싱을 사용하는 것이 좋습니다.모양이 있는 빈 행렬을 만들 수 있다는 사실이 마음에 듭니다.
Re: JMP 13의 JSL 매트릭스/목록 프로그래밍 변경 사항큰 개선. 다음은 행렬에 대한 또 다른 제안입니다. 조건문을 사용할 때 인덱싱을 단순화하십시오. 이것은 예를 통해 가장 잘 설명됩니다. 5보다 큰 값을 찾고 반환하려는 행렬이 있다고 가정해 보겠습니다.
mymatrix = [2,4,6,8,10];
newmatrix=mymatrix[loc(mymatrix>5)];
이것을 R의 유사한 코드와 비교하십시오.
mymatrix = matrix(cbind(2,4,6,8,10));
newmatrix=mymatrix[mymatrix>5];
좋습니다. R의 첫 번째 문장은 더 길고 두 번째 문장은 행렬이 아닌 벡터를 반환하지만 두 번째 문장은 더 짧습니다. JMP가 향후 버전에서 두 번째 문에서 더 간단한 구문을 구현할 수 있다면 좋을 것입니다.
Re: JMP 13의 JSL 매트릭스/목록 프로그래밍 변경 사항단일 값 행렬의 새로운 처리가 개선되었다는 점에 동의하지만 혼란스러운 빈 행렬 출력 [](0,1)을 제거해 달라는 Mark Bailey의 요청도 두 번째입니다. []로 바꾸면 사용자가 이해하고 처리하기가 더 쉬울 것입니다. 저는 보통 다음과 같은 논리를 사용하여 이 상황을 처리합니다.
dt=current data table();
rows_to_capture=dt<<GET rows="" where=""></GET>
Re: JMP 13의 JSL 매트릭스/목록 프로그래밍 변경 사항차원이 0이 아닌 다른 빈 행렬을 구분합니다. 때로는 모양이 중요합니다.
show(x00,nrows(x00),ncols(x00));
show(x10,nrows(x10),ncols(x10));
show(x01,nrows(x01),ncols(x01));
show(x11,nrows(x11),ncols(x11));
x00 = [];
N Rows(x00) = 0;
N Cols(x00) = 0;
x10 = [](1, 0);
N Rows(x10) = 1;
N Cols(x10) = 0;
x01 = [](0, 1);
N Rows(x01) = 0;
N Cols(x01) = 1;
x11 = [1];
N Rows(x11) = 1;
N Cols(x11) = 1;
Re: JMP 13의 JSL 매트릭스/목록 프로그래밍 변경 사항고급 스크립팅 과정에서 결과가 빈 행렬이지만 실제로 반환되는 것은 다음과 같은 경우가 있습니다. [](0,1) ..이 형식은 무해한 것처럼 보이지만(즉, 단순한 빈 행렬처럼 동작함) 항상 설명이 필요했습니다. 무엇을 (0,1) 표현하고 어떻게 사용합니까? 아무 것도 나타내지 않거나 어떤 목적에도 기여하지 않는 경우 제거하는 것을 고려하십시오.
Re: JMP 13의 JSL 매트릭스/목록 프로그래밍 변경 사항이 예외를 처리해야 하는 많은 코드가 있습니다.이것은 확실한 개선입니다.미리 알려주셔서 감사합니다. 이 상황을 처리하는 데 사용한 현재 코드 패턴에 어떤 영향을 미치는지 살펴보겠습니다.
Re: JMP 13의 JSL 매트릭스/목록 프로그래밍 변경 사항머리 숙여 감사합니다.......이것이 올바른 방향입니다.....
Re: JMP 13의 JSL 매트릭스/목록 프로그래밍 변경 사항이것은 올바른 방향으로 나아가는 훌륭한 단계입니다.