에서 근무했음에도 불구하고 JMP 10년이 넘는 시간 동안 저는 여전히 새로운 것을 배우고 있습니다. 가장 최근에는 이시카와 다이어그램과 재귀의 힘에 대한 새로운 관점이었습니다. 둘 다 오랜 세월 동안 주변에 있었지만 내가 그들에게 관심을 갖게 된 것은 특정한 도전이 있기 전까지는 아니 었습니다. 이 새로운 동기는 제가 개발할 때 왔습니다. 지오코딩 2020 , 서버와 통신하기 위해 REST API를 사용하는 추가 기능입니다. 서버에서 오는 데이터는 데이터에 따라 상당히 클 수 있는 JSON 배열 형식이었습니다. 에 숨겨진 보석 중 하나 JMP (또는 더 구체적으로 JSL에서) JSON 배열을 JSL 목록 또는 연관 배열로 변환하는 Parse JSON() 명령입니다. 꽤 좋은 출발점이었지만 여전히 데이터의 특정 부분을 가져오려면 해당 부분을 찾고 처리하는 방법을 알아야 했습니다. 목록과 배열에 깊숙이 쌓인 수백 개의 항목으로 배열이 만들어지면 쉬운 작업이 아닙니다. 그래서 저는 이 유용한 작은 프로그램을 작성하기로 결정했습니다. stackmole.jsl , 데이터 구조에 대한 개요를 제공합니다. 그리고 그래픽 프레젠테이션을 찾지 않았다면 존경할만한 JMPer가 아니었습니다.
모든 서버 호출은 완전히 다른 깊이, 너비 및 볼륨으로 데이터를 전달할 수 있습니다. 데이터의 일부 유무는 데이터 자체에 따라 다릅니다. 해당 데이터 구조가 어떻게 생겼는지 미리 아는 것은 불가능합니다. 계속해서 데이터를 찾아야 하는지, 다음 목록이나 배열을 찾아야 하는지, 마지막에 있는지 스스로 결정할 수 있는 프로그램이 필요했습니다. 재귀는 그 문제에 대한 나의 대답이었습니다. 수학에서 재귀 정의를 알고 있지만 데이터 구조에서 어떻게 작동합니까? 의외로 잘!
단계별 데이터 구조 및 재귀
재귀는 이전 단계에서 생성한 결과에 동일한 규칙이나 논리를 적용하는 것을 의미합니다. 정수의 계승의 정의는 가장 널리 알려진 예입니다. 숫자의 계승은 해당 숫자의 모든 작은 숫자를 1까지 곱한 것입니다. 즉, 3의 계승은 종종 3으로 표시됩니다! = 3 * 2 * 1 = 6. 스크립팅 가이드는 해당 루틴에 대한 명령문을 보여줍니다.
myfactorial = Function( {a},
If( a == 1,
1,<BR /> a * Recurse( a - 1 )
)
);
재귀는 함수에만 적용할 수 있습니다. 명령은 함수 자체에 있으며 새 인수로 해당 함수를 호출합니다. 3!의 예에서 함수는 인수로 3을 사용하여 호출됩니다: myfactorial(3). 3은 1이 아니므로 IF 문의 else 절이 실행됩니다. 이는 myfactorial(2)의 결과에 3을 곱하는 것을 의미합니다. 다시 말하지만, 그것은 1과 같지 않으며 else 절은 이제 2를 myfactorial(1)의 결과와 곱합니다. 이제 결과가 있습니다. 그것은 1이다.
JMP는 이전의 열린 작업이 이 결과(2 * 1 = 1)에 2를 곱하는 것이었고 그 이전의 작업은 재귀 결과(3 * 2 = 6)에 3을 곱하는 것이었습니다. 3이 최상위 수준이었으므로 결과는 6입니다. 메커니즘은 계단을 내려가는 것으로 상상할 수 있습니다. 모든 단계에서 열린 작업이 내려집니다. 프로그램은 더 이상 재귀가 없을 때까지 필요한 만큼 단계를 진행합니다. 계단을 다시 올라가는 동안 모든 작업을 수집하고 결과와 함께 시작 층으로 끝납니다.
JSL은 일부 데이터 컬렉션(예: 많은 값을 나타내는 변수)을 알고 있습니다. 이 프로그램으로 분석할 수 있는 구조는 목록과 연관 배열입니다. 목록은 다음과 같이 쉼표로 구분된 요소 목록입니다.
목록 = {"a", "b", 1, 2}
연관 배열은 키-값 쌍의 목록입니다.
assarr = ["a" => "이", "b" => "이다", "c" => "a", "d" => "문장"];
각 쌍의 첫 번째 요소는 키입니다. 두 번째는 값입니다. 키는 고유해야 하며 내부적으로 알파벳순으로 정렬됩니다.
개념이 다르기 때문에 각 구조는 콘텐츠를 변경하거나 읽기 위해 서로 다른 명령이 필요하며 스크립팅 가이드에서 찾아볼 수 있습니다. 간단한 목록을 분석하여 스택 몰이 생성하는 출력은 무엇입니까?
list = {"a1", "b1", "c1"};
stackmole (l);

데이터 테이블은 두더지가 구조의 깊이로 드릴다운할 때 찾은 항목 목록입니다. 행은 하위 관점에서 해석됩니다. 전체 집합은 첫 번째 자식(수준 2)이 해당 목록의 첫 번째 항목인 목록입니다. 이 자식(2행)은 데이터이고 그 값은 "a1"입니다. 데이터는 모든 여정의 끝점입니다. 즉, 다른 항목이 없으면 항목은 0입니다.
더 많은 정보를 제공하는 것은 계층적 스타일의 Ishikawa 다이어그램인 원인 및 결과 다이어그램입니다. 하단에는 대괄호 안에 인덱스가 있는 데이터 값이 있습니다. 이 작은 예에서 전체 집합의 이름은 "목록"이므로 "b1"을 얻으려면 목록 [2]입니다.
병렬 플롯은 전체 세트가 세 개의 요소로 분할되고 다음 레벨 요소는 데이터를 포함하므로 더 이상 분할되지 않음을 보여줍니다. 작은 구조를 이해하는 데 도움이 되지만, 이 기사의 끝에서 아무런 도움이 되지 않는 다채로운 병렬 다이어그램을 보여드리겠습니다.
연관 배열에 대한 결과는 키 이름을 포함한다는 점에서 목록 보고서와 약간 다릅니다.
sentencearray = ["a" => "This", "b" => "is", "c" => "a", "d" => "sentence"];
stackmole(sentencearray);

전체 집합의 유형은 연관 배열의 줄임말인 aa입니다. 전체 집합을 "sentencearray"라고 합니다. 해당 배열에서 "sentence"라는 단어에 액세스하려면 sentencearray ["d"]를 사용하십시오.
이 방법은 요소 집합이 있는 하나의 구조만 사용하므로 간단합니다. 그러나 JMP에서는 이러한 구조를 임의의 방식과 깊이로 쌓을 수 있습니다. 따라서 목록의 연관 배열의 연관 배열 목록이 있을 수 있습니다. … 이 예에서:
array = ["2list1" => {{"4list1_1", "4list1_2", "4list1_3"}, {"4list2_1", "4list2_2"} },
"2list2" => {{"4list3_1", "4list3_2"}, "4element1" } ];
"배열"은 "2list1" 및 "2list2"라는 두 개의 키가 있는 연관 배열입니다. 각 키의 값은 목록이며 첫 번째 목록은 다시 두 개의 목록으로 구성되고 두 번째 목록은 목록과 데이터 요소로 구성됩니다. 각 용어의 시작 부분에 있는 숫자는 해당 요소가 있는 스택의 깊이를 나타냅니다. 계단의 비유에서 이 요소에 도달하기 위해 내려가야 하는 단계의 수입니다.
이 경우 스택 몰은 다음 정보를 제공합니다.

그림에는 현재 21개의 행이 있는 데이터 테이블의 일부만 표시되어 있습니다. 계층 다이어그램이 완성되었습니다. 데이터 요소 4list3_2(굵게 표시됨)에 도달하려는 경우 경로는 다음과 같습니다.
배열["2list2"][1][2]
다음은 전혀 도움이 되지 않지만 여전히 흥미로운 패턴을 제공하는 병렬 플롯의 예입니다.

프로그램에는 분석의 단일 단계와 재귀가 적용되는 방법을 설명하는 많은 주석이 있습니다.