| 스피커 |
성적 증명서 |
| 조던 힐러 |
안녕하세요 여러분. 저는 조던 힐러입니다. 이번 강연은 "이 코드를 훔쳐라! 강화된 로그에서 얻은 스크립트에 세 가지 업그레이드를!"입니다. |
| |
이 강연의 영감은 바로 이것입니다. 선동가이자 사회운동가인 애비 호프먼의 책에서 따온 것입니다. 네, 그는 자신의 책에 "이 책을 훔쳐라(Steal this Book)"라는 제목을 붙였는데, 정말 멋진 제목입니다. 책 제목을 그렇게 짓는 게 좋은 사업 계획인지는 모르겠지만, 어쨌든 아주 매력적인 제목입니다. |
| |
그렇다면 왜 이 코드를 훔치려는 걸까요? JMP는 여러분이 코드를 훔치기를 원합니다. JMP에서 마우스를 가리키고 클릭만 하면 분석이 완료됩니다. |
| |
포인트 앤 클릭의 코드가 저장됩니다. 향상된 로그에 저장되므로 다시 사용할 수 있습니다. |
| |
그리고 그게 프로덕션 스크립트의 약 90%입니다. 그걸 가져와서 재사용하면 |
| |
일반적인 작업을 자동화하고, 여러 번 클릭하는 대신 버튼 하나만 클릭하면 됩니다. 이것이 바로 여기의 목표입니다. |
| |
향상된 로그의 스크립트는 프로덕션 스크립트의 뼈대, 골격입니다. |
| |
약 10% 정도는 직접 작성해야 하는데, 이것이 바로 이 강연의 목표입니다. 제작 대본을 하나로 묶는 연결 조직에 대해 이야기해 보겠습니다. |
| |
그래서 이 강연에서 저는 여러분에게 문법의 세부적인 내용보다는 |
| |
큰 그림에 대해 훨씬 더 자세히 설명할 수 있고, 이는 제가 생각하는 JSL 프로그래밍을 배우는 좋은 방법이기도 합니다. 기존 코드를 참고하여 예제를 통해 배우는 것이 훨씬 더 좋습니다. 그 코드를 활용하세요. |
| |
원하는 작업을 수행하는 스니펫을 찾으세요. JMP 사용자 커뮤니티나 스크립팅 가이드에서 찾을 수 있을 거예요. |
| |
그냥 복사해서 원하는 대로 수정하면 됩니다. 모든 복잡한 구문을 다 알 필요는 없습니다. 그렇게 하면 훨씬 더 많은 것을 얻을 수 있을 겁니다. 경험이 쌓일수록 구문을 배우는 것도 자연스럽게 따라오게 됩니다. |
| |
향상된 로그를 통해 코드를 개선하는 세 가지 사례 연구를 살펴보겠습니다. 먼저 JSL에 대해 살펴보겠습니다. 어떤 분들께는 JSL의 기본을 소개하는 데 도움이 될 수도 있겠네요. |
| |
따라서 JSL을 처음 시작하는 경우 알아야 할 중요한 점은 모든 것이 객체라는 것입니다. |
| |
무언가를 하려는 것은 데이터 테이블과 데이터 테이블의 열, 배포 플랫폼, 그래프 빌더, Fit Y by X와 같은 플랫폼을 포함하는 객체입니다. |
| |
그리고 해당 플랫폼에서 제공되는 보고서도 있습니다. 객체가 있을 때, 객체를 조작하는 방식은 메시지를 보내는 것입니다. 객체는 메시지를 받습니다. 강화된 로그에서 복사한 아주 간단한 예시는 다음과 같습니다. |
| |
샘플 데이터 디렉터리에서 Big Class 데이터 테이블을 열고 간단한 분포 분석을 실행해 보세요. 로그에서 복사한 코드는 다음과 같습니다. |
| |
지금. |
| |
우리가 하고 싶은 첫 번째 작업은 데이터 테이블의 이름을 지정하는 것입니다. 이름을 지정하고, 이를 위해 여기 5번째 줄의 코드를 가져와서 개선했습니다. |
| |
나머지 부분, 즉 명령문의 open 부분 앞에 bctable=을 추가했습니다. 알겠죠? 그러면 데이터 테이블을 열 때 bctable이라는 이름이 생성됩니다. 저는 bctable을 선택했는데, 설명서에 dt라고 적혀 있을 겁니다. 원하는 이름을 사용하세요. dt는 여러분이 지정해 줬습니다. |
| |
이제 이 파일을 강조 표시하고 실행 버튼을 클릭하여 Big Class를 열고 동시에 bctable이라는 이름을 지정하여 실행해 보겠습니다. 이렇게 하는 것이 왜 중요한지, 이제 이 파일이 생겼기 때문입니다. |
| |
핸들. 나중에 코드에서 사용할 수 있는 후크, bctable이에요. 제가 bctable이라고 말할 때마다 빅 클래스를 말하는 거예요. |
| |
그래서 |
| |
다음 줄은 배포 명령인데, 이것도 수정했습니다. 아시다시피, 여기 로그에서 보면 이건 그냥 배포 명령입니다. 뭔가... |
| |
데이터 테이블을 가리키지 않습니다. 이렇게 실행하면 JMP는 포커스가 있는 데이터 테이블에서만 실행합니다. |
| |
현재 데이터 테이블은 빅 클래스인데, 바로 전에 열었으니까요. 하지만 항상 명시적으로 지정하는 것이 좋습니다. 어떤 데이터 테이블을 대상으로 작업할지 명시적으로 지정하는 것이 좋으므로, 이렇게 실행해 보겠습니다. |
| |
bctable, 그리고 이중 화살표, 그리고 배포 명령입니다. 그래서 우리가 추가한 것은 이중 화살표가 있는 bctable입니다. |
| |
메시지를 보내는 구문은 다음과 같습니다. 오른쪽의 배포 메시지를 왼쪽의 bctable이라는 이름의 데이터 테이블로 보냅니다. bctable에 마우스를 올리면 Big Class라는 것을 알 수 있습니다. 따라서 전체 과정을 실행하면, |
| |
우리는 배포 보고서를 받습니다 |
| |
우리가 원했던 것. |
| |
이제... 한 단계 더 나아가서, 종종 이렇게 해야 합니다. 플랫폼을 실행하면서 이름을 정할 텐데요. |
| |
여기 이중 화살표와 등호를 모두 포함하는 줄이 있습니다. 좋습니다. 자, 그럼... 오른쪽에서 왼쪽으로 읽어 봅시다. 이 배포 메시지를 받아서 bctable로 보낼 겁니다. |
| |
그리고 그 모든 것의 결과인 플랫폼을 distplat이라는 변수에 저장할 것입니다. |
| |
실행해 봅시다. |
| |
좋아요, 똑같아 보이지만 차이점은 이제 나중에 코드에서 사용할 수 있는 JSL 변수 distplat이 있다는 것입니다. |
| |
이걸 어디에 쓰시겠어요? 출력에 빨간색 삼각형 옵션을 추가하는 데 쓸 수도 있을 것 같은데, 여기서는 그걸로 바꿔 볼게요... |
| |
그 분포 보고서를 여러분이 볼 수 있는 곳으로 가져오세요. |
| |
그리고 우리는 그 distplat 객체를 가져올 겁니다. 그게... 그게 배포 플랫폼이에요. |
| |
보세요, 마우스를 그 위에 올려놓고 이 선을 실행해 봅시다. 분포 플랫폼에서 정규 5분위수 플롯을 켜 보세요. 여기 있습니다. |
| |
좋아요. |
| |
마지막 단계는 플랫폼을 가져가서 이 객체를 여기로 가져가는 것입니다. |
| |
여기서 보고서 객체를 가져오죠. 바로 이 줄입니다. 플랫폼 객체로 보고서 메시지를 보내면 보고서 객체를 가져옵니다. |
| |
코드에서 이러한 값에 접근하려면 이렇게 해야 합니다. 보고서에 있는 숫자, 그래프, 그래픽 요소 등 모든 값에 접근하려면 이 작업이 필요합니다. rdistplat이라는 객체가 필요합니다. rdistplat을 한 번 더 실행해 보세요. |
| |
실행해 봤는데 아무것도 보이지 않지만, 이제 rdistplat이라는 객체가 생겼습니다. 이 객체는 디스플레이 상자라고 되어 있는데, 나중에 이 객체를 사용해서 보고서의 숫자에 접근하는 방법에 대해 설명하겠습니다. |
| |
좋아, 내 로그를 지울게요 |
| |
그리고 우리와 함께 시작하세요 |
| |
사례 연구. |
| |
그래서 우리가 배울 첫 번째 기술은 데이터 테이블의 다른 열에서 동일한 명령을 계속 반복하는 것입니다. for each 명령을 사용하여 루프를 통해 열을 반복합니다. |
| |
이건 정말 일반적인 요구 사항인데, 때로는 열의 형식이나 모델링 유형을 변경하는 것처럼 간단한 일만 하면 됩니다. |
| |
매우 복잡할 수도 있습니다. |
| |
열의 변환을 수행하고 관리도를 실행하여 해당 관리도를 바탕으로 뭔가를 하는 거죠. 네, 확장성이 있습니다. 이 기법은 확장성이 뛰어납니다. |
| |
JSL 코드로 이 작업을 수행하는 방법은 다음과 같습니다. 먼저 가리키고 클릭해서 원하는 작업을 수행하겠습니다. 단일 열에 대해 작업을 수행한 다음, 향상된 로그를 사용하여 해당 코드를 가져올 것입니다. |
| |
이제 스크립트의 뼈대가 완성되었습니다. 이제 해당 작업을 수행할 모든 열에 대해 반복하도록 스크립트를 수정하겠습니다. |
| |
루프와 반복에 사용할 방법은 for each입니다. 이는 JMP 16에서 도입된 것이므로 이 기술은 이전 버전의 JMP에서는 작동하지 않습니다. |
| |
여기서도 JSL 목록이라는 개념이 사용되므로 이에 대해서도 잠깐 이야기해 보겠습니다. |
| |
좋아, 시작할게요 |
| |
JMP에서 홈 창부터 시작해 보겠습니다. |
| |
그리고... 로그를 확인해 볼게요. 깨끗한지 확인해 볼게요. 아, 한 가지 삭제해야 할 게 있어요. 로그를 지워야죠. 좋아요, 원하는 것을 가리키고 클릭해 볼까요? sc20이라는 데이터 테이블을 열겠습니다. |
| |
이 데이터 표는 온라인에서 찾을 수 있는 프레젠테이션 자료에서 확인할 수 있습니다. |
| |
그리고 이 데이터 테이블을 보면 ID 열이 있고 그 다음에 약 20개가 있습니다. |
| |
데이터 열입니다. 이 열에는 소수점 이하 자릿수가 너무 많고 정밀도가 너무 높아서 소수점 이하 두 자리에서 잘라내고 싶습니다. 따라서 데이터의 소수점 이하 두 자리만 표시하도록 형식을 변경해 보겠습니다. |
| |
간단한 포인트 앤 클릭 작업입니다. 마우스 오른쪽 버튼을 클릭하고 열 정보로 이동하세요. |
| |
그리고 기본 표시 형식을 소수점 이하 두 자리로 고정하는 것으로 변경하겠습니다. |
| |
좋습니다. 이제 NPN1에 대해 그 작업을 수행했으므로, 같은 작업을 수행하고 싶은 다른 열이 19개 더 있습니다. |
| |
그러면 향상된 로그를 살펴보겠습니다. |
| |
바로 이 코드입니다. NPN1 열의 형식을 변경하는 데 필요한 코드입니다. 이 코드를 재사용하려면 빨간색 삼각형으로 이동하여 스크립트를 클립보드나 새 스크립트 창에 저장할 수 있습니다. |
| |
이전에 작업했던 다른 파일로 전환해서 이 문제를 좀 더 자세히 살펴보겠습니다. |
| |
좋아요. |
| |
여기 처음 두 줄... 세 줄은 로그에서 가져온 코드입니다. 좋아요, 가장 먼저 할 일은 데이터 테이블을 여는 겁니다. |
| |
그리고 제가 약간 편집한 것을 눈치채셨을 겁니다. 긴 경로 이름과 이 파일에 대한 긴 디렉토리 경로를 삭제했습니다. |
| |
이렇게 실행하면, |
| |
JMP 데이터 테이블 sc20이 이 JSL 파일과 같은 디렉토리에 있는 한 작동합니다. 즉, 현재 있는 디렉토리의 로컬 파일 경로와 같습니다. |
| |
어쨌든, 로그에서 데이터 테이블을 열고 여기서 해당 형식 변경을 적용하고, 고정 소수점 10자리를 소수점 두 자리로 표현합니다. |
| |
테이블...왼쪽에 있는 열 참조는 열을 지정하는 한 가지 방법입니다. 여러 가지 방법이 있지만, 콜론을 사용하는 경우 이 방법이 매우 일반적입니다. 콜론 왼쪽에는 테이블 참조...참조...참조가 있고, 콜론 오른쪽에는 열 이름이 있습니다. |
| |
이건 다시 로그에서 직접 따온 거예요. |
| |
JMP는 로그에서 이런 방식으로 데이터 테이블을 처리합니다. 앞서 말씀드린 대로, 파일을 열 때 JSL 이름을 지정하고, 이후에도 해당 JSL 이름을 사용하는 것이 더 좋다고 생각합니다. 그래서 콜론 앞에 있는 "business" 대신 "dt"로 변경했습니다. |
| |
자, 여기 같은 코드가 있습니다. 약간 수정한 것인데, 실행해 보면, 네, 제대로 작동합니다. 데이터 테이블이 열리고 |
| |
형식을 소수점 두 자리로 변경합니다. 좋아요, 이제 그게 있으니 꽤 쉬운 일이죠. |
| |
나머지 19개 열을 다 바꾸면 되죠. 네, 여기 NPN1이 있는데, 그 줄을 복사해서 전부 바꾸고 19번 더 쓰면 됩니다. |
| |
네, 물론 비효율적이죠. 프로그래밍의 장점 중 하나는 같은 작업을 두 번 이상 할 필요가 없다는 거예요. 그러니까 이걸 한 번만 작성하면 유지 관리가 훨씬 쉬워지죠. 19번, 20번씩 작성하는 대신요. |
| |
방법은 다음과 같습니다. 가장 먼저 할 일은 작업할 모든 열의 목록을 가져오는 것입니다. |
| |
그리고 제가 '리스트'라고 말할 때, 단순히 일반적인 종류의 리스트를 말하는 것이 아닙니다. JSL 리스트, 즉 JSL로 프로그래밍할 때 사용하는 특정 데이터 구조를 말하는 것입니다. |
| |
리스트는 컨테이너에 담긴 두 개의 객체일 뿐이며, 이를 사용하는 방식입니다. 열 객체로 구성된 리스트를 만드는 세 가지 방법을 소개합니다. |
| |
첫 번째 방법은 수동으로 하는 것입니다. 모든 것을 직접 입력하는 것이죠. 이렇게 실행하면, |
| |
3개의 테이블 참조...3개의 열 참조, NPN1, PNP1, PNP2. |
| |
제 코드와 CNames 변수 위에 마우스를 올려놓았을 때 모두 중괄호가 눈에 띄네요. 중괄호 안에 있는 변수들을 보면... JSL에서 리스트를 다루고 있다는 걸 알 수 있습니다. |
| |
좋아요, 목록을 만드는 한 가지 방법이네요. 다른 몇 가지 방법에 대해서도 이야기해 볼까요? 이 예제에서는 이 방법을 사용할 겁니다. |
| |
"이봐, 내 현재 데이터 테이블에 있는 모든 연속 열을 가져와." 라고 말하는데, 여기서는 dt라고 이름 붙인 데이터 테이블에 있는 열입니다. 메시지 객체로 새 목록을 만듭니다. |
| |
그럼 이걸 실행해 볼까요. |
| |
이제 CNames 위에 마우스를 올려보면, 우리가 원하는 것이 무엇인지 알 수 있습니다. 이게 우리가 작업하려는 20개 항목의 전체 목록입니다. |
| |
좋아요, 마지막으로, 사용자가 데이터 테이블에서 어떤 열을 선택할지 선택하도록 할 수 있습니다. 이렇게 생겼습니다. 저는 두 개만 선택하겠습니다. IVP와 PNP4를 선택하겠습니다. 두 열이 선택되었습니다. |
| |
그리고 내가 이것을 실행하면, |
| |
우리는 데이터 테이블에서 선택한 두 열만 포함된 목록을 얻습니다. |
| |
좋습니다. 하지만 목록을 받으면 다음 작업은 해당 서식 줄을 목록의 각 항목에 적용하는 것입니다. 이를 루핑 또는 반복이라고 합니다. |
| |
이전 방법은 다음과 같습니다. JMP의 for 명령을 사용합니다. JMP 16 이전에는 이렇게 했었는데, 아직 JMP 15를 사용하시는 분들을 위해 참고용으로 여기에 올려두었습니다. 하지만, |
| |
아시다시피, 새로운 사용자를 찾는 건 조금 복잡하고 두려운 일이지만, JMP 16에서 목록을 사용하면 훨씬 더 간결하고 읽기 쉬운 방법이 있습니다. 목록의 모든 요소에 대해 작업을 반복하려면 각 명령에 이것을 사용할 수 있습니다. |
| |
좋습니다. 이제 살펴보고 무슨 일이 일어나는지 봅시다. 세 개의 인수를 받는데, 각 인수는 쉼표로 구분되어 있습니다. 오른쪽에서 왼쪽으로 처리하겠습니다. |
| |
마지막 인수는 포맷 명령입니다. 포맷을 적용하고, dt NPN1에 적용하는 대신, 한 열에 적용하는 대신, 여기에 자리 표시자를 넣고 목록 항목을 선택했습니다. 원하는 것을 선택하세요. |
| |
네, 이건 그냥 단어, 변수 이름일 뿐입니다. 원하는 대로 선택하세요. 저는 '목록 항목'을 선택했습니다. 이게 우리의 자리 표시자이고, 목록의 각 항목에 대해 실행할 명령입니다. 어떤 목록인가요? 이 목록, 알겠습니다. 이게 우리의 목록이고, 두 번째 목록입니다. |
| |
인수입니다. 첫 번째 인수는 플레이스홀더입니다. 맞죠? 이 플레이스홀더를 사용하여 목록에 있는 항목의 값을 저장한다는 것을 알려줍니다. |
| |
중괄호로 묶여 있으므로 이 코드를 재사용할 경우 중괄호를 사용해야 합니다. |
| |
따라서 전체 내용은 다음과 같습니다. 20줄 이상의 코드 대신, 3줄의 코드만 있고 여기에는 데이터 테이블을 여는 것도 포함됩니다. |
| |
열 이름 목록을 가져온 다음 반복합니다... 20개의 연속된 열 모두에 대해 이 작업을 반복합니다. 전체 과정을 실행하려면 어떻게 보이는지 확인하세요. |
| |
그리고 그것이 있습니다. 이제 각 열은 |
| |
형식에 소수점 두 자리까지 표시됩니다. |
| |
좋습니다. 그래서 그것은 for each를 사용하여 매우 간단한 작업을 수행하는 매우 간단한 예였습니다. |
| |
기둥 위에. |
| |
조금 더 흥미로운 예를 보여드리겠습니다. |
| |
다음은 동일한 데이터 세트의 sc20에 대한 예입니다. |
| |
각 열에 대한 관리도를 만들고, 그 관리도를 일지에 첨부해서 전부 PDF로 저장할 거예요. 알겠어요? |
| |
각각에 대해 같은 것을 사용하고, 처음 두 인수도 같습니다. 아시다시피, 목록 항목이 첫 번째이고, 두 번째 항목은 목록 이름입니다. 하지만 이제 세 번째 항목에 대해... for each의 세 번째 인수에 대해 코드가 많아졌습니다. |
| |
자, 시작해 볼까요. 스크립트 전체를 실행해 봅시다. |
| |
관리도를 여러 개 열어서 실행하고, 저널에 붙여 넣었습니다. 이제 데스크톱을 보면, 모든 관리도가 담긴 '보고서.pdf'가 있습니다. 1페이지에 관리도와 페이지 나누기가 있습니다. 1페이지, 2페이지, 3페이지. |
| |
그러니 여러분도 이 예시를 자유롭게 살펴보실 수 있습니다. 프레젠테이션 자료에 포함되어 있습니다. |
| |
좋아요, 이게 우리가 이야기할 첫 번째 기술입니다. 다음 기술을 위해 로그를 정리하겠습니다. |
| |
좋아요, 보고서에서 값을 추출하는 작업입니다. JSL에서는 이런 일이 자주 발생합니다. 어떤 종류의 분석을 수행하는데, 분포 분석일 수도 있고 회귀 분석일 수도 있습니다. |
| |
뭔가를 얻고, 거기서 뭔가를 수집하세요. 평균이나 중앙값일 수도 있고, 회귀 분석의 기울기 계수일 수도 있고, P값일 수도 있습니다. |
| |
이것이 바로 우리의 역할인데, 여기서 까다로운 점은 보고서가 계층적이고 고도로 중첩된 구조를 가지고 있어서, 그 계층 구조와 트리 구조를 따라 내려가며 원하는 것을 정확히 찾는 것이 조금 까다로울 수 있다는 것입니다. 그래서 제가 여러분께 요령을 하나 알려드리겠습니다. |
| |
비결은 평소처럼 분석을 통해 가리키고 클릭한 다음 원하는 것을 잡는 것입니다. |
| |
텍스트 색상을 빨간색으로 바꾸겠습니다. 서식만 약간 변경한 겁니다. 그런 다음 해당 스크립트를 로그에 저장하면 빨간색 항목을 처리하는 방법을 알아낼 수 있습니다. |
| |
JSL로요. 그럼 같이 살펴보도록 하죠. |
| |
다시 JMP로 돌아가겠습니다. |
| |
Big Class를 열어서 높이 열에 대한 분포를 실행해보겠습니다. |
| |
좋아요, 여기 제가 뭔가 추출하고 싶은 분포 보고서가 있습니다. 중앙값이라고 가정해 봅시다. 이 경우 중앙값은 63이고, 이 값을 JSL 변수에 저장해서 나중에 재사용할 수 있도록 하겠습니다. 이 변수를 이용해서 코드를 작성하거나 계산을 하거나 그런 식으로 할 겁니다. |
| |
숫자 63을 알아내는 방법을 알려드리겠습니다. |
| |
제가 잡고 싶은 것의 색상이나 글꼴 등을 변경해 보세요. 어떻게 하는지 아시는 분 계신가요? 이걸 본 적이 없다면, 알아두시면 좋을 것 같아요. |
| |
도구 모음에 속성을 위한 버튼이 있는데, JMP 16의 새로운 버튼인 것 같습니다. |
| |
따라서 이 보고서의 속성을 켜면, |
| |
이 나무를 따라 내려가면 필요한 걸 찾을 수 있어요. 자, 이걸 보세요. |
| |
숫자 열 상자, 오른쪽. 보고서의 다른 부분을 클릭하면 해당 |
| |
해당 항목과 해당 항목이 표시되는 상자의 종류는 속성 패널에서 강조 표시됩니다. |
| |
좋아요, 그럼 이 모든 결과가 있는 것은 숫자가 모두 들어 있는 숫자 열 상자이고, 제가 말했듯이 이걸 가져다가 텍스트 색상을 빨간색으로 바꾸겠습니다. |
| |
바로 그렇게요. |
| |
이제 속성 패널을 닫겠습니다. |
| |
보고서가 있고, 이 스크립트를 향상된 로그로 보내보겠습니다. |
| |
빨간색 삼각형, 스크립트를 로그에 저장합니다. |
| |
그리고 지금 그 기록을 보고 있습니다. |
| |
바로 이 부분이 우리가 원하는 부분입니다. 아시다시피, 이 부분에는 중앙값과 다른 통계량의 텍스트 색상을 빨간색으로 변경하는 부분이 있는 분포 명령이 있습니다. 이제 이 부분을 좀 더 자세히 살펴보겠습니다. |
| |
좋아요, 여기 그 코드가 있습니다... 향상된 로그에 있는 것과 같은 코드입니다. 방금 여기에 복사해서 약간 서식을 조정했으니, 필요한 부분에 대해 더 자세히 이야기해 보겠습니다. |
| |
그래서 우리가 이렇게 한 이유는 바로 이 부분을 얻기 위해서였습니다. 이제 해석해 보죠. send를 사용해서 report를 만들고, 그 안에서 dispatch를 사용합니다. |
| |
여기서는 dispatch의 네 가지 인수에 집중하겠습니다. 처음 세 가지 인수가 필요하고, 네 번째 인수는 색상을 변경하는 것인데, 사실 우리가 관심 있는 건 그게 아닙니다. 우리가 관심 있는 건 디스플레이 상자, 즉 우리가 원하는 요소를 처리하는 것입니다. |
| |
첫 번째 인수는 탐색입니다. 표시 상자로 이동하라는 의미입니다. 이 상자는 실제로 윤곽선이 있는 상자입니다. 윤곽선 상자로 이동하라는 의미입니다. |
| |
여기요. 그럼 보고서를 살펴보죠. JMP에서 보고서에 이런 중첩 수준이 있다는 걸 눈치채셨을 텐데요, 맞죠? 저는 그냥... |
| |
외곽선 상자 분포입니다. 그 안에는 외곽선 상자 높이가 있고, 그 안에는 외곽선 상자 분위수가 있으며, 그 분위수 안에는 제가 추출해야 할 내용이 있습니다. |
| |
그러니까 그게 저한테 하는 말이에요. 저 나무를 따라 걸어가라고 하는 거죠. 높이와 분위수만 알면 그걸로 식별이 가능할 거예요. |
| |
좋습니다. 다음 두 인수는 우리가 빨간색으로 표시한 이 요소에 대해 뭔가를 알려줍니다. 세 번째 인수는 숫자 열 상자라는 것을 알려주는데, 속성에서 확인했습니다. |
| |
그리고 두 번째 주장은 우리에게 제목을 알려줍니다. |
| |
해당 열 상자의 숫자입니다. 이건 비어 있습니다. 제목이 없지만 괜찮습니다. 이 정보를 사용해서 데이터를 가져올 수 있습니다. 제목이 있는 경우도 있고 없는 경우도 있습니다. |
| |
좋습니다. 이제 이것이 있으므로 해당 정보를 가져와서 사용하겠습니다. |
| |
중앙값을 추출합니다. |
| |
해당 코드는 다음과 같습니다. 23번째 줄에서 시작해서 29번째 줄까지 이어집니다. |
| |
데이터 테이블을 다시 열어보겠습니다. |
| |
분포의 이름을 지정하고, 연속 분포를 수행합니다. |
| |
우리는 그런 발송과 보고서 전송 기능이 없다는 걸 알 수 있을 겁니다. 프로덕션 스크립트에서 빨간색으로 바꿀 필요가 없기 때문이죠. |
| |
그렇죠. 분포 분석을 수행하고 플랫폼의 이름을 지정하세요. |
| |
중요해요. 보고서 레이어에 접근해야 합니다. 이 줄을 통해 보고서 레이어를 추출하고, rdist라는 보고서 객체를 생성합니다. |
| |
그리고, 여기가 바로 마법이 일어나는 지점입니다. 우리가 그것을 잡는 지점입니다. |
| |
중간값을 JSL 변수 mdn에 할당하고, 이 경우에는 로그에 기록합니다. 이에 대해 좀 더 자세히 설명드리겠지만, 먼저 전체 코드를 한 번 실행해서 어떤 결과가 나오는지 확인해 보겠습니다. |
| |
23번째 줄부터 실행하려고 하는데, 어휴, 이렇게 하죠. 23번째 줄부터 29번째 줄까지 실행해 볼게요. |
| |
분포를 수행했습니다. 빨간색이 아니고 중앙값을 추출했습니다. 이제 mdn에 저장되어 있는데, 해당 변수의 값이 63인 것을 확인할 수 있습니다. |
| |
중앙값은 63입니다. 완벽해요. |
| |
괜찮은. |
| |
그래서 여기 우리가 추출하는 라인이 있습니다. |
| |
중간값은 보고서의 63입니다. |
| |
그것을 살펴보죠. 이것을 여기에 불러와서 |
| |
우리가 이것을 할 때 이것을 언급하세요. |
| |
자, 여기 그 줄이 있습니다. 다시 정리해서 각 요소를 개별적으로 살펴볼 수 있도록 한 겁니다. |
| |
63은 보고서의 중간값입니다. |
| |
그 방법은 다음과 같습니다. |
| |
이것을 서브스크립트라고 합니다. JSL 코드에서 대괄호가 보인다는 것은 객체를 서브스크립트한다는 것을 의미합니다. 해당 객체는 일종의 컨테이너로, 디스플레이 상자나 |
| |
종종 목록입니다. 이런 방식으로 목록을 첨자로 만들 수도 있습니다. 즉, 이 보고서 객체에서 중첩된 항목을 추출하는 것입니다. |
| |
가장 먼저 할 일은 높이 윤곽선 상자입니다. 기억하시죠? 그리고 거기서 분위수 상자로 넘어갑니다. 기억하시죠? |
| |
이제 우리는 올바른 위치에 있습니다. 원하는 것을 가져오기만 하면 됩니다. 우리가 원하는 것은 숫자 열 상자입니다. 맞죠? 그리고 거기에는 |
| |
제목을 사용할 수 있는데 (여기 위에 있던 건 제목이 없었는데), 대신 숫자로 참조합니다. 분위수 개요 상자의 첫 번째 숫자 열 상자입니다. |
| |
이걸 보고 "잠깐만, 여기 숫자들이 있잖아. 저것도 숫자 col 상자잖아, 그렇지?"라고 생각하실 수도 있겠네요. 아니, 사실 숫자 col 상자가 아니에요. 문자열 col 상자이고, 원하시면 그 모든 것들을 체크할 수 있다는 걸 기억하세요. 다시 말하지만, 속성에서 나온 거예요. |
| |
그리고 여기를 클릭하면, |
| |
숫자 열 상자, 문자열 열 상자, 문자열 열 상자. 여기 보이시나요? 문자열...문자열 숫자, 그러니까 첫 번째 숫자 열 상자입니다. |
| |
그러면 이 모든 숫자를 다 잡을 수 있을 거예요. |
| |
좋아요, 마지막으로 해야 할 일은 이 첨자입니다. 이렇게 첨자를 붙이면 여섯 번째 요소를 가져오라는 뜻입니다... 1, 2, 3, 4, 5, 6. 이게 중앙값인데, 63입니다. 이 줄을 실행하면 보고서에 첨자가 붙습니다. 이 중앙값을 가져와서 나중에 다시 사용할 수 있게 됩니다. |
| |
보고서에서 무언가를 가져오는 방법이 있습니다. 프레젠테이션 자료에서 공유할 또 다른 예가 있습니다. |
| |
제목이 있는 요소가 있는데, 이런 상황에 처하면 이를 모델로 삼아 자신의 작업을 수행할 수 있습니다. |
| |
좋습니다. 마지막으로 논의할 내용은 스크립트를 실행하는 사람인 사용자로부터 입력을 받는 방법입니다. |
| |
그리고 어떤 파일을 분석할지, 심지어 데이터 테이블의 어떤 열을 분석할지 선택하게 하세요. 이게 아마 가장 흔한 방식일 거예요. |
| |
초보 스크립터들이 하고 싶어 하는 일이죠. 예를 들어, 저는 한 열에서 특정 작업을 하도록 스크립트를 설정했고, 조직 내 다른 사람들에게도 뭔가를 전달하고 싶습니다. |
| |
다른 데이터에서 직접 할 수 있도록 하는 거죠. 그러니까 스크립트를 이렇게 일반화해서 사용자가 파일이나 열, 또는 둘 다 선택할 수 있게 하면, |
| |
스크립트를 일반화하면 그 가치가 크게 높아집니다. 조직 내 다른 사람들에게도 제공할 수 있습니다. 그들은 여러분의 작업을 복제하여 클릭 수고 없이 빠르게 작업할 수 있습니다. |
| |
좋아요, 이 섹션에서는 사례 연구라기보다는 좀 더 구체적인 내용을 다룹니다. 사용자가 파일을 선택하도록 하는 세 가지 방법과 열을 선택하도록 하는 두 가지 방법을 보여드리겠습니다. |
| |
파일을 선택하는 방법부터 시작해 보겠습니다. 평소처럼 로그에서 작업을 한 다음 복사하는 것부터 시작하겠습니다. Big Class를 열면 이렇게 보입니다. 로그에 이렇게 나오는데, Big Class를 열면 됩니다. |
| |
dt. 이 경우에는 dt를 사용하고 있으므로 Big Class를 열면 |
| |
이제...dt는 Big Class를 가리키고 있습니다. 알겠죠? 그리고 저는 제작 대본 작업을 계속할 겁니다. |
| |
중요한 점은 사용자가 원하는 파일을 선택할 수 있도록 하기 위해 해야 할 일은 dt가 다른 것을 가리킬 수 있는 방법을 찾는 것뿐입니다. |
| |
나머지 스크립트를 작성하고 dt를 사용한 다음 시작 부분에서 이를 변경할 수 있습니다. dt는 더 이상 Big Class를 가리키는 것이 아니라 다른 것을 가리킬 것입니다. |
| |
알겠습니다. 그리고 그것은 사용자가 결정하는 또 다른 것입니다. |
| |
스크립트를 실행하는 사람입니다. 네, 가장 쉬운 방법은 데이터 테이블을 여는 대신 이 줄을 사용하는 것입니다. 스크립트 시작 부분에서 이 줄을 사용하여 dt를 할당하면, |
| |
즉 JMP가 이 스크립트를 실행하고 dt를 제공한다는 의미입니다. |
| |
앞에 있는 데이터 테이블의 이름을 지정합니다. |
| |
따라서 사용자 관점에서 볼 때 그들이 하는 일은 데이터 테이블을 여는 것입니다. 여기서 sc20을 열고 sc20을 만들 것입니다. |
| |
제 현재 데이터 테이블입니다. 여기 위에 보이시나요? 이 창에 나열된 것이 현재 데이터 테이블입니다. |
| |
따라서 사용자가 데이터 테이블을 열고 스크립트를 실행한 다음 이 줄을 만나면 dt는 이제 sc20을 가리키게 됩니다. |
| |
꽤 강력한 방법이죠. 문제는... 사용자가 정확히 무엇을 해야 하는지 알아야 한다는 겁니다. 먼저 데이터 파일을 열고 스크립트를 실행해야 한다는 것을 알아야 하죠. |
| |
좀 더 강력한 기능을 제공할 수 있습니다. 스크립트를 실행할 때 파일 선택기를 표시하여 디렉터리 구조를 탐색하고 원하는 파일을 찾을 수 있도록 할 수 있습니다. |
| |
알고 보니 정말 간단하더군요. 여기 있는 모든 걸 없애고, Big Class에 대한 참조도 없애고, 인수 없이 그냥 open이라고만 하면 됩니다. |
| |
JSL이 시도하면... JMP가 이 줄을 해석하려고 하면, "좋아요, 사용자가 뭔가를 열려고 하는데, 뭘... 뭔지 전혀 모르겠어요."라는 메시지가 나옵니다. 파일 선택기를 보여줘서 사용자가 선택할 수 있도록 해 봅시다. |
| |
그럼... 실행해 봅시다. dt = open. |
| |
스크립트를 실행하세요. 여기 일반 파일 선택기가 있고, 데스크톱에서 Iris를 열겠습니다. |
| |
아이리스는 열려 있고, 당연히 dt라는 이름이 붙어 있죠. |
| |
모든 JMP 파일, 모든 파일, 그렇죠. 여기에 많은 내용이 표시될 수 있습니다. |
| |
따라서 더 많은 제어가 필요하다면, 앗, 더 많은 제어가 필요하다면 |
| |
사용자가 선택할 사항에 대해, open 대신 pick file이라는 것을 사용하겠습니다. |
| |
Pick file은 몇 가지 옵션이 있는 명령인데, 저는 그중 세 가지만 사용하겠습니다. |
| |
이 예제를 살펴보겠습니다. pick file의 처음 세 인수는 선택기 창에 표시되는 제목입니다. |
| |
선택기가 시작될 디렉터리와 해당 선택기에서 열 수 있는 파일을 알려주는 필터가 있죠. 자, 그럼 이 줄, 이 코드 섹션, 즉 파일 선택 명령을 실행해서 결과를 PF에 저장해 봅시다. |
| |
실행해 보세요. |
| |
좋아요, 여기 인수가 있고, 엑셀 파일을 선택하세요. 창 제목에 보이는 내용이 바로 그것입니다. |
| |
두 번째 인수의 폴더, 경로가 시작 위치입니다. |
| |
세 번째는, "사용자에게 엑셀 파일만 보여줘"라고 하는 파일 필터인데, 여기 아래에 있습니다. 엑셀 파일에서 다른 파일로 변경할 수 없습니다. 엑셀 파일로만 제한되어 있거든요. |
| |
그럼 샌드위치라고 가정하고, 열기를 클릭해 봅시다. |
| |
잠깐만요. 왜 열리지 않았을까요? |
| |
음, 확인해 볼까요. PF는 pick file과 같습니다. PF가 뭐죠? 아, PF는 열고자 하는 파일의 경로입니다. 아직 open 명령을 내리지 않았네요. Pick file은 파일을 여는 게 아니라, 파일을 선택하는 겁니다. |
| |
따라서 원을 닫으려면 다음과 같이 해야 합니다. 다음을 열어 테이블 참조를 만듭니다. |
| |
PF 변수는 우리가 원하는 파일, 즉 우리가 원하는 엑셀 파일을 가리킵니다. |
| |
자, 이제 샌드위치 데이터 테이블이 열리고, 이제 dt가 생겼으니 스크립트를 작성할 준비가 되었습니다. 제가 원했던 대로 말이죠. |
| |
여기서 잠깐 중요한 것을 보여드리겠습니다. Pick file, 이런 문제에 직면했는데 모든 인수를 알지 못하고 더 자세히 알고 싶다면 몇 가지를 알려드리겠습니다. 우선, |
| |
호버 도움말은 구문에 대한 정보를 제공하는 작은 팝업입니다. 더 나은 옵션이 있습니다. 스크립트 창에서 마우스 오른쪽 버튼을 클릭하세요. |
| |
스크립팅 인덱스에서 찾아볼 수 있습니다. 스크립팅 인덱스는 모든 JSL 프로그래머에게 매우 중요한 도구이며, |
| |
찾고 있는 명령이 들어 있습니다. 인수 목록과 설명 텍스트가 있고, 정말 중요한 건, 실행해서 어떤 기능을 하는지 확인할 수 있는 몇 가지 예제가 있다는 겁니다. 그러니까 이 예제를 실행하면 pick 파일이 생성됩니다. |
| |
글쎄, 그것은 나를 내가 가고 싶지 않은 어딘가로 보냈어요. |
| |
그냥 닫아버리자. |
| |
그럼, 우리는 실험을 해서 이 코드를 빼내고, 이 코드를 훔쳐서 우리의 스크립트에서 사용할 수 있을 겁니다. |
| |
네, 스크립팅 인덱스입니다. 도움말 메뉴에서도 볼 수 있습니다. 스크립팅 메뉴... 위쪽에 있는 것들을 찾아보세요. |
| |
현재 데이터 테이블, 네이키드 오픈, 또는 파일 선택 등이 있습니다. 다른 방법도 있지만, 이 세 가지가 시작하기에 좋은 방법입니다. |
| |
이제 사용자가 어떤 열에서 작업할지 선택하도록 하는 방법에 대해 알아보겠습니다. |
| |
여기 있습니다... 기록에서 복사한 게 있습니다. '가격'이라는 데이터 테이블을 열고 시간 경과에 따른 사과 가격을 보여주는 그래프를 그렸습니다. |
| |
포인트 앤 클릭 부분은 보여드리지 않고, 스크립트만 실행해 보겠습니다. 강화된 로그에서 스크립트를 추출하는 방법은 이미 알고 계시리라 생각하니, 스크립트가 어떤 역할을 하는지 살펴보겠습니다. Opens prices와 그래프가 있는데, 날짜별 사과 가격, 시간별 사과 가격입니다. |
| |
이 데이터 표를 보세요. 가격, 네, 사과도 있지만, 다른 것들도 있죠. 그럼 사용자가 어떤 그래프를 보고 싶은지, 어떤 열을 그래프로 보고 싶은지 직접 지정하게 하고 싶다면 어떻게 해야 할까요? |
| |
이 섹션의 목적은 사용자에게 선택권을 주는 것입니다. |
| |
좋아요. |
| |
두 가지 방법을 살펴보겠습니다. 첫 번째 방법은 다음과 같습니다. |
| |
사용자가 선택한 열에서 작동합니다. |
| |
그리고 우리는 이전에도 이 구문을 본 적이 있습니다. 아마 두 번째 사례 연구에서도 이 구문을 본 적이 있을 겁니다. 네, 이렇게 목록을 만드는 거죠. |
| |
데이터 테이블에서 선택된 열이 포함된 테이블입니다. 해당 데이터 테이블로 돌아가 보겠습니다. |
| |
나는 세 개의 열을 선택할 것입니다. |
| |
달리자 |
| |
이거요. 사실 dt를 실행해야 할 것 같아요. 둘 다 실행해 봅시다. |
| |
닭고기, 커피, 계란. |
| |
괜찮은. |
| |
그래서. |
| |
어떤 걸 작업해야 할까요? 음, 작업 방법은 아시죠? 루프를 사용해서 목록을 반복하는 방법은요. 하지만 우리는 그렇게 하지 않을 거예요. 그냥 단축키를 사용할 거예요. 이렇게 말할 거예요. |
| |
사용자가 두 개 이상을 선택한 경우, 첫 번째 항목만 그래프로 표시하면 됩니다. 즉, 사용자는 스크립트를 실행하기 전에 닭고기, 커피, 계란을 선택했습니다. 저는 닭고기에 대한 그래프만 표시하고 싶습니다. |
| |
네, 다음 줄입니다. 구독하는 부분이 있습니다. CNames 목록을 구독해서 첫 번째 항목을 가져오는 거죠. |
| |
그러면 이것을 실행해 보겠습니다. |
| |
이제 내 col이라는 멋진 변수가 생겼습니다. |
| |
목록의 첫 번째 항목인 닭고기, 콜론으로 열 참조. |
| |
이제 그래프 빌더를 실행할 수 있습니다. 이제 우리 삶을 계속 살아가면 됩니다. 유일한 차이점은 원래 있던 부분을 여기로 옮겼다는 것입니다. |
| |
이제 제 col입니다. 이게 우리가 만든 유일한 변경 사항이고, 이걸 실행하면 닭고기 가격 그래프를 얻을 수 있습니다. |
| |
좋은. |
| |
네, 그것도 한 가지 방법이지만, 앞서 말씀드렸듯이 사용자가 무엇을 해야 하는지 알아야 합니다. 이렇게 하려면... |
| |
이 방법을 사용하려면 사용자가 데이터 테이블을 열고, 해당 테이블을 선택한 다음, 스크립트를 실행해야 한다는 사실을 알아야 하는데, 이는 약간 번거롭습니다. |
| |
대신 런타임에 사용자에게 열 선택 대화상자를 표시하는 것이 좀 더 강력합니다. 다음과 같은 모습입니다. 구문이 약간 복잡합니다. 모든 세부 사항을 자세히 설명하지는 않겠습니다. 이전과 마찬가지로 데이터 테이블을 엽니다. |
| |
우리는 이 명령을 사용하고 있습니다. 이 명령은 열 대화라고 합니다. |
| |
선택기를 표면화하려면...사용자에게 열 선택기를 제공해야 합니다. |
| |
다시 말씀드리지만, 여기에는 많은 주장이 있습니다. 저는 몇 가지만 언급하겠습니다. 제가 하는 말은, "상품 선택" 버튼을 만들어 달라고 요청하는 겁니다. 사용자는 해당 상품에 대해 최대 한 개의 열을 선택할 수 있고, 최소 하나는 선택해야 합니다. |
| |
그럼 여기서, 60번째 줄부터 이 스크립트를 실행해 보겠습니다. |
| |
시작 가격, 여기 제 대화가 있습니다. 아주 적은 코드로 얼마나 풍부한 대화가 나오는지 보세요. 이게 바로 우리가 사용하는 이 열 대화의 장점입니다. 그럼 커피를 선택하고 확인을 클릭하겠습니다. |
| |
좋습니다. 다시 대본으로 돌아가서, 방금 이 대사를 실행했습니다. |
| |
그리고 우리가 선택한 결과는 dlg에 저장됩니다. 한번 살펴보죠. |
| |
네, 좀 복잡하네요. dlg는 리스트라고 되어 있는데, 중괄호를 보세요. 그리고 중괄호가 중첩되어 있어서, 마치 중첩된 리스트처럼 보이네요. |
| |
구독을 통해 원하는 결과를 얻을 수 있습니다. 이 부분을 설명하는 데 많은 시간을 들이지는 않겠지만, 필요하다면 이 코드를 복사할 수 있습니다. 따라서 대화에서 '커피'라는 부분만 가져오려면, 거기에 커피에 대한 열 참조를 추가해야 합니다. |
| |
내 컬럼을 구독하려면 다음 줄을 실행하세요. |
| |
이제 내 col에는 커피 컬럼에 대한 참조만 포함되어 있으며 이는 이전과 동일합니다. 그래프 빌더를 사용하여 실행합니다. |
| |
내 col을 사과로 대체하면 커피나 사용자가 선택한 다른 음료가 나옵니다. |
| |
좋아요, 제가 여러분과 공유하고 싶었던 건 여기까지입니다. 이제 JSL 프로그래밍을 처음 시작하는 분들을 위한 작은 조언으로 마무리하겠습니다. |
| |
조언은, JMP가 코드를 최대한 수정하도록 하는 것입니다. 향상된 로그 기능은 바로 이 로그에서 해당 코드를 훔쳐오는 기능입니다. 스크립트의 대부분을 차지하는 부분이죠. |
| |
그리고 나서 연결 조직, 즉 여러 요소를 하나로 묶어서 사용 가능한 프로덕션 스크립트로 만드는 부분만 작성하면 됩니다. 그 코드도 훔칠 수 있습니다. 스크립팅 인덱스에서 훔칠 수도 있고, 이 프레젠테이션에서도 훔칠 수 있습니다. |
| |
모든 자료는 이 프레젠테이션에 포함되어 있으며 JMP 사용자 커뮤니티의 JSL 요리책에서 도용할 수도 있습니다. JSL 요리책은 일반적인 JSL 작업에 대한 훌륭한 리소스이며 해당 작업을 수행하는 데 필요한 코드를 제공합니다. |
| |
그리고 다시 한번 강조하지만, 구문에 너무 집착하지 마세요. 코드를 가져와서 필요한 부분만 바꾸는 게 훨씬 쉽습니다. 아무것도 망가뜨리지 않을 뿐만 아니라, 경험이 쌓일수록 이 구문의 미묘한 부분까지 익힐 수 있을 겁니다. |
| |
귀하의 관심에 감사드립니다. |