사후에 실행되지 않는 한 실행되지 않는 스크립트 부분"X"에서 0으로 값을 변경하기 위해 테이블의 열을 다시 코딩하는 데 사용하는 스크립트의 일부가 있습니다. 메인 스크립트와 별도로 실행할 때 이 코드 부분이 작동하도록 했습니다(JMP 토론 포럼에 감사드립니다!!). 그러나 이것을 더 큰 스크립트에 삽입하면(맨 끝에 있더라도) JMP는 내 명령을 실행하지 않습니다. 코드가 내 스크립트 중간에 배치되었을 때 실행되지 않은 모든 것... 그래서 코드를 기본 스크립트의 맨 아래로 옮겼지만 여전히 실행되지 않습니다. 매번 이 부분을 강조하고 실행할 때마다 내가 원하는 것이 정확히 수행됩니다.
나는 wait(0);을 구현하고, i에서 k로 변경하고, For Each Row 주변에서도 Try 문을 사용하려고 시도했지만 운이 없었습니다. 왜 그것이 사실 이후에만 작동하는지에 대해 정말 머리를 긁적입니다. 제안?
//Recode columns in Yield Table to give "0" instead of X's
wait(0);
yieldcols = Yields << get column names;
For Each Row( For( k = 1, k <= N Items( yieldcols ), k++,
If( Is Missing( As Column( yieldcols[k] )[] ),
As Column( yieldcols[k] )[] = 0 ) ) );
고급 통계 모델링자동화 및 스크립팅데이터 혼합 및 정리실험 설계대량 맞춤화Re: 사후에 실행되지 않는 한 스크립트의 일부가 실행되지 않습니다.안녕,
제가 제공한 코드가 왜 작동하지 않는지 잘 모르겠습니다. 다음을 시도해 볼 수 있습니다.
1) 제가 제공한 원본 코드를 새 창에서 단독으로 실행해 보세요. 작동합니까? 그렇지 않다면 어떤 버전의 JMP를 사용하고 있습니까? 직접 데이터 테이블 인덱싱은 몇 버전 전에 추가되었지만 예를 들어 JMP 12에는 없습니다.
2) 위의 1)이 작동한다고 가정하면 다음 단계는 "dt"의 모든 인스턴스를 "yields"로 바꾸고 새 창에서 새 코드만 실행하는 것입니다. 이것은 나에게 효과가 있었고 1) 당신에게 효과가 있었다면 당신에게도 효과가 있을 것으로 기대합니다.
Names Default To Here(1);
//create a table with roughly 10% missingness
yields = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( yields ), i++,
yields[Loc( Is Missing( yields[0, i] ) ), i] = 0
);
3) 테이블의 데이터가 수식 기반인 경우 수식은 열에 "기록"되었을 수 있지만 누락된 부분을 수정하려는 JSL이 실행되기 시작할 때까지 평가가 완료되지 않을 수 있습니다. 코드 앞에 다음 줄을 추가하여 코드를 실행하기 전에 모든 수식이 완전히 업데이트되었는지 확인하세요.
Yields << run formulas;
4) "수익률"이 관심 있는 데이터 테이블 이외의 다른 항목을 참조하지 않는지 확인하세요. 열 이름, 다른 변수 이름, 테이블 변수 등이 아닙니다. 이러한 이유로 테이블을 가리키는 데 사용되는 변수 이름 어딘가에 "dt"를 사용하는 것이 가장 좋습니다. 실수로 값의 행렬이나 벡터 이름을 "Yields"로 지정하여 테이블 핸들 "Yields"를 덮어쓰는 것을 상상하기는 쉽지만, 실수로 그러한 행렬이나 벡터의 이름을 "YieldDt"로 지정할 가능성은 훨씬 적습니다. 그러나 실행을 일시 중지하면 프로그램이 작동하므로 이것이 문제라고 생각하지 않습니다.
1)과 2)가 효과가 있고 3)과 4) 모두 문제를 해결하지 못하는 경우, 도움을 주기 위해 추가 정보가 필요합니다. 즉, 샘플, 정리된 테이블, 해당 테이블에 대해 실행하여 다음을 보여줄 수 있는 코드 조각이 필요합니다. 해당 테이블에서는 교체가 작동하지 않습니다.
건배,
브래디
Re: 사후에 실행되지 않는 한 스크립트의 일부가 실행되지 않습니다.안녕하세요 마크. 이것은 이제 별도로 실행되지만 더 큰 스크립트의 작은 부분으로 작동하지 않습니다. 이것이 스크립팅 문제가 아니라 또 다른 문제인지 궁금합니다. 코드 섹션이 단독으로 실행될 때 작동하는 이유와 더 큰 스크립트의 작은 부분으로 실행될 때 실패하는 이유는 무엇입니까(첫 번째 시나리오에서처럼 마지막으로 실행되는 경우에도)?Re: 사후에 실행되지 않는 한 스크립트의 일부가 실행되지 않습니다.안녕하세요 브래디 님,
모든 조언과 도움에 감사드립니다. 그러나 귀하가 제공한 이 코드 섹션은 (테이블 이름을 변경한 후) 작동하지 않는 것 같습니다. 나는 그것이 매우 이상하다고 생각합니다. 그것이 작동하지 않을 이유가 없습니다. 어떤 아이디어가 있나요?
For( i = 1, i <= N Col( Yields ), i++,
Yields[Loc( Is Missing( Yields[0, i] ) ), i] = 0
);
내 질문을 조금 바꿔 말하면 다음과 같습니다. 현재 가지고 있는 코드는 별도로 실행하면 작동하지만 더 큰 코드의 작은 섹션으로 실행하면 작동하지 않습니다. . 나는 그 자체가 이상하다고 생각합니다. 내 코드를 변경해도 문제가 없습니다. 문제가 아닌 것 같습니다. ("완벽"은 아니지만) 작동하기 때문입니다! 이것이 버그일까요? 아니면 이 문제를 해결할 수 있는 방법이 있나요? 디버깅할 때도 오류가 없습니다.
Re: 사후에 실행되지 않는 한 스크립트의 일부가 실행되지 않습니다.또한 행이나 열이 여러 개인 경우 nrows(dt) 또는 ncols(dt)를 변수에 바인딩하고 이를 상위 인덱스로 사용하므로 nrow(dt) 또는 ncol(dt)는 반복할 때마다 평가할 필요가 없습니다.
//do some stuff
);nc = ncol (dt);
for (i = 1, i<=nc, i++,
JMP 16에서는 foreach( ) 루프를 사용하여 이 작업을 수행할 수 있습니다. foreach row( )와 혼동하지 마세요. For Each( )에는 기본 for( ) 루프에 비해 변수의 로컬 범위 지정 및 경우에 따라 더 빠른 실행과 같은 몇 가지 다른 장점이 있습니다. JMP 16을 사용하고 계시다면 꼭 확인해 보세요.
for each ( { i }, 1::nrow( dt ),
//do some stuff
);
Re: 사후에 실행되지 않는 한 스크립트의 일부가 실행되지 않습니다.또한 For Each Row()를 전혀 사용하지 않는다는 점을 먼저 인정하겠습니다.
항상.
아이들이 공짜로 먹어도 마찬가지다.
행을 반복해야 하는 경우(이 예제에서와 같이 직접 인덱싱하거나 << 값 가져오기를 사용하고 결과 목록 또는 행렬을 연산하는 등의 방법으로 열의 값을 한 번에 모두 가져오면서 이를 피하려고 합니다.) , 나는 적절한 for( ) 루프를 작성합니다.
For Each Row( )가 결코 작동하지 않는다는 말은 아닙니다. 나는 그것이 경고와 함께 제공된다고 말하고 있는데 이러한 경고가 무엇인지 모르겠습니다. 그래서 나는 전염병과 같은 For Each Row( )를 피하고 다른 사람들도 1) 경고 사항을 기꺼이 배우고 2) 코드를 편집, 유지 관리 또는 상호 작용하는 사람들이 기꺼이 가정하지 않는 한 다른 사람들에게도 똑같이 할 것을 권장합니다. 미래도 마찬가지일 것이다.
후자는 가능성이 너무 낮기 때문에 전자를 맡는 것을 고려한 적이 없습니다.
건배,
브래디
for (i =1, i<=nrow(dt), i++,
//do some stuff
);
Re: 사후에 실행되지 않는 한 스크립트의 일부가 실행되지 않습니다.안녕,
큰 테이블의 성능이 중요하다면 다음을 시도해 볼 수 있습니다(참고: 테이블 이름으로 dt를 사용했습니다). 중간 정도의 테이블(100,000행 x 5열)에서 내 컴퓨터의 성능 차이는 0.0056초와 0.8261초로 눈에 띕니다. 여기에는 몇 가지 이유가 있습니다.
첫째, Loc( ) 및 Is Missing( ) 함수는 전체 열에 대해 한 번에 사용하더라도 빠릅니다. 이것이 바로 여기서 수행하는 작업입니다. 즉, dt[0, i]는 i열 전체를 검색합니다.
또한 열을 직접 인덱싱하면 해당 이름을 가져오거나 해당 열이 포함된 목록에서 검색할 필요가 없습니다.
건배,
브래디
Names Default To Here(1);
//create a table with roughly 10% missingness
dt = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( dt ), i++,
dt[Loc( Is Missing( dt[0, i] ) ), i] = 0
);
Re: 사후에 실행되지 않는 한 스크립트의 일부가 실행되지 않습니다.//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[col] )[] ), As Column( yieldcols[col] )[] = 0 ) )
);
Re: 사후에 실행되지 않는 한 스크립트의 일부가 실행되지 않습니다.방금 시도해 보았습니다. 별도로 실행하더라도 작동하지 않습니다. 내가 가지고 있는 원래 스크립트는 작동하지만 별도로 실행하는 경우에만 작동합니다(사실 전체 스크립트가 실행된 후 해당 섹션을 Ctrl+R로 실행한 후).Re: 사후에 실행되지 않는 한 스크립트의 일부가 실행되지 않습니다.//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[k] )[] ), As Column( yieldcols[k] )[] = 0 ) )
);