조건이 작동하지 않는 동안 비어 있는 For 루프를 사용하여 연관 배열을 통해 반복주로 조언을 받았어요 연관 배열의 요소를 통한 반복 연관 배열을 반복하는 방법에 대해 설명합니다. 내 이해는 반복자가 값이 아닌 키를 반복하지만 값에 쉽게 액세스할 수 있다는 것은 배열을 가지고 있다는 것입니다.
내 코드는 다음과 같습니다.
Names Default To Here(1);
dt1 = Open("file path" );
dt2 = Open("file path 2");
Summarize(dt1, IDs = by(:ID)); //this finds all the unique IDs in the data file, which we will need
//First, populate the temporary data structure--associative array--from the dt1 data file which we will then copy over to the dt2 data file.
For (i=1, i<=N Items(IDs), i++,
ID = IDs[i];
temp_array = Associative Array ({"Val1","Val2","Val3"},{{},{},{}});
For ( temp = temp_array << First, Is Empty(temp_array[temp]), temp = temp_array << Next(temp),//looping through temp_array's keys is clunky but done this way in JMP
query_date = dt1 << Select Where (:"ID" == ID);
Write(query_date);
//etc not there yet because the above not working
);
);
여정의 이 시점에서 관심 있는 변수는 계속 진행해야 하는 query_date입니다.문제는 쓰여진대로 내부 루프가 어떤 이유로 한 번도 실행되지 않는다는 것입니다. 루프의 while 조건은 루프가 종료되기를 원할 때까지 True로 평가되어야 하므로 다음과 같이 설정했습니다.
Is Empty(temp_array[temp])
temp_array[temp]가 연관 배열의 첫 번째 값이기 때문입니다. 여기서 temp는 첫 번째 키인 "Val1"이고 값은 {}입니다. 중요한 질문은 {}가 Is Empty()에서 True 또는 False로 평가됩니까? {}는 Google에서 처리하지 않는 특수 문자이기 때문에 Google에서 검색조차 할 수 없습니다. 그래서 내가 왜 혼란스러워하는지 알 수 있습니다.
내 스크립트의 나머지 부분은 이미 코딩되어 있으며 이 시점에서 사소한 오류가 있어도 작동할 것이라고 상당히 확신합니다. 따라서 이 장애물을 통과할 수 있다면 많은 도움이 될 것입니다. 유사 코드는 내 마음 속에 매우 명확하며 새로운 JMP JSL 사용자로서 상황이 더 명확해지고 있어 감사하게 생각합니다. 도와주셔서 감사합니다!
마이크
데이터 접근Re: 조건이 작동하지 않는 동안 비어 있는 For 루프를 사용하여 연관 배열을 반복합니다.다음은 관련 열 ID, 날짜 및 내가 사용하고 싶은 몇 가지 다른 열을 포함하여 CSV 형식의 익명화된 데이터(첨부됨)입니다.
이것이 도움이 되는지 아닌지 알려주세요. 나는 이 질문에 대한 답을 얻기 위해 대화를 계속할 의향이 있습니다.
마이크
Re: 조건이 작동하지 않는 동안 비어 있는 For 루프를 사용하여 연관 배열을 반복합니다.네, 잠시만요. 모든 데이터와 식별자를 빨리 익명화해야 합니다...
마이크
Re: 조건이 작동하지 않는 동안 비어 있는 For 루프를 사용하여 연관 배열을 반복합니다.변수와 열 이름이 동일한 경우 범위 지정 오류 메시지가 표시됩니다.예를 들어 열과 ID라는 변수가 있습니다.또한 query_date.
열 이름을 유지하고(쉽게) 변수 이름을 변경하십시오.예: ID 및 one_id, :query_date 및 one_query_date.
Re: 조건이 작동하지 않는 동안 비어 있는 For 루프를 사용하여 연관 배열을 반복합니다.샘플 데이터 테이블을 제공할 수 있습니까?Re: 조건이 작동하지 않는 동안 비어 있는 For 루프를 사용하여 연관 배열을 반복합니다.나는 뛰고있어
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
Write(theRows);
theRows를 선택하는 것이 작동하는지 확인하기 위한 것입니다. 하지만 우리가 그렇게 멀리 가는 것 같지는 않습니다. 다음을 인쇄합니다.
[](0, 1)
여기서 루프를 통한 각 반복에 대해 데이터 테이블에서 매우 포괄적인 행(최대 20열)을 인쇄해야 합니다. 나는 무슨 일이 일어나고 있는지 전혀 모른다.
암시적 질문에 답하는 데 도움을 주기 위해 theRows는 루프에 지정된 값과 일치하는 ID 열 값의 결과 행을 찾기 위한 임시 변수일 뿐입니다(ID의 여러 복사본으로 인해 이러한 특성의 여러 행이 있을 수 있음).
이것이 혼란스럽다는 것을 알고 있습니다... 하지만 그것이 제가 고군분투하는 이유이기도 합니다.
미리 감사드립니다.
마이크
Re: 조건이 작동하지 않는 동안 비어 있는 For 루프를 사용하여 연관 배열을 반복합니다.알았어......추측하고 있었어.query_date를 찾아야 한다고 표시했으며 Select Where()와 관련이 있는 것으로 나타났습니다.그래서 데이터 테이블에 query_date라는 열이 있고 Select Where() 또는 Get Rows Where()는 원하는 쿼리 날짜가 있는 행을 반환할 것이라고 추측했습니다.그리고 쿼리 날짜를 찾을 수 있는 위치를 잘못 추측한 것 같습니다.
Re: 조건이 작동하지 않는 동안 비어 있는 For 루프를 사용하여 연관 배열을 반복합니다.안녕 크레이지. 이것은 작동하는 것 같습니다. 매우 감사합니다.
남자 이름
Re: 조건이 작동하지 않는 동안 비어 있는 For 루프를 사용하여 연관 배열을 반복합니다.답장을 보내 주셔서 감사합니다, 짐. 한 가지: 이해가 안 돼요
query_date = dt1:query_date[ theRows[1] ];
query_date가 아직 인스턴스화되지 않았기 때문입니다.
이것은 오타입니까(다른 변수라고 가정함)?
로그는 여기에서도 오류를 발생시킵니다.
Scoped data table access requires a data table column or variable in access or evaluation of 'dt_ld4:query_date' , dt_ld4:query_date/*###*/
나는 일반적으로 이것을 스스로 알아낼 것이지만 이 문제는 놀랍도록 어려운 것으로 판명되어 완전히 확신하지 못합니다.
무리 감사,
마이크
Re: 조건이 작동하지 않는 동안 비어 있는 For 루프를 사용하여 연관 배열을 반복합니다.고마워요, 짐. 빠른 답변을 해주셔서 좋았습니다. 감사합니다. 이 모든 것을 다시 분석할 시간을 좀 주세요. 주말입니다.
마이크Re: 조건이 작동하지 않는 동안 비어 있는 For 루프를 사용하여 연관 배열을 반복합니다.연관 배열을 사용하는 이유를 모르겠습니다.실행하려는 루프가 무엇을 해야 한다고 생각하는지 확장할 수 있습니까?
IsEmpty()는 스크립트가 참조 항목이 무엇인지 모르면 1을 반환하고 참조 항목이 IsEmpty() 실행 이전에 스크립트에서 사용된 경우 0을 반환하는 함수입니다.
그러므로:
a={};
isEmpty(s);
// returns 0 since a has been referenced prior in the script
isEmpty(b);
// returns 1 since JMP has not seen the variable b before
에 관하여
query_date = dt1 << Select Where (:"ID" == ID);
Select Where()는 작업을 수행하지만 아무 것도 반환하지 않습니다.따라서 query_date에는 값이 없습니다.Select Where()가 수행하는 작업은 선택 기준을 충족하는 데이터 테이블의 모든 행에 대해 선택된 행 상태를 "켜기"로 설정하는 것입니다.데이터 테이블에서 둘 이상의 행에 ID 값이 있는 경우 여러 행이 선택됩니다.아마도 당신이 찾고 있는 것은 선택한 행의 쿼리 날짜 값일 것입니다.선택한 행의 행 번호를 얻을 수 있습니다.
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
스케일러가 아닌 행 번호의 행렬을 반환합니다.따라서 query_date를 얻으려면 아래 첨자를 참조해야 합니다.
dt1 << select where( :ID == ID );
theRows = dt1 << get selected rows;
query_date = dt1:query_date[ theRows[1] ];
선택 단계가 필요하지 않은 더 간단한 형식은 Get Rows Where()를 사용하는 것입니다.
query_date = dt1:query_date[ dt1 << get rows where( :ID == ID )[1] ];
내가 도움이 되고 혼란스럽지 않기를 바랍니다.질문을 계속하십시오.
Re: 조건이 작동하지 않는 동안 비어 있는 For 루프를 사용하여 연관 배열을 반복합니다.for 루프의 조건은 키가 비어 있지 않은 동안 실행되어야 합니다.
For ( temp = temp_array << First, ! Is Empty(temp), temp = temp_array << Next(temp),
연관 배열의 <<
! 이다 ~ 아니다 운영자.
편집 : 당신은 이와 같은 것을 원할 수 있습니다
temp_array = Associative Array( {"Val1", "Val2", "Val3"}, {{1, 2}, {}, {3, 4, 5}} );
For( temp = temp_array << First, !Is Empty( temp ), temp = temp_array << Next( temp ),
If( N Items( temp_array[temp] ) > 0,
Write( "\!nkey=", temp, " has ", N Items( temp_array[temp] ), " elements" ),
Write( "\!nkey=", temp, " has no elements" )
)
);key=Val1에는 2개의 요소가 있습니다.
key=Val2에는 요소가 없습니다.
key=Val3에는 3개의 요소가 있습니다.