동기화 모드?안녕 모두,
JMP / JSL의 비동기 부분으로 고민하고 있습니다. 이제 "수식 실행 ()"을 사용하여 수식을 사용하기 전에 평가를 수행 할 수 있지만 다른 함수와 비슷한 문제가 있음을 이해했습니다.
값을 사용하면 올바르지 않을 수 있습니다. 이것은 매우 위험합니다!
JSL이 지시에 따라 지시를 받고 다음으로 이동하기 전에 체계적으로 완료 될 때까지 기다리는 "강제 동기화 모드"가 있습니까?
내 현재 문제의 예를 하나의 테이블 (dt)에서 행 선택 (selRows) 값을 추출하여 다른 테이블 (sumdt)의 행을 채 웁니다.
thisCol = Column(sumdt, thisName||"_Q10");
valueSet = Column(dt, colList[i])[selRows];
thisValue = Quantile(0.10, valueSet);
thisCol[] = thisValue;
thisCol = Column(sumdt, thisName||"_Q25");
thisValue = Quantile (0.25, valueSet);
thisCol[] = thisValue;
thisCol = Column(sumdt, thisName||"_Q50");
thisValue = Quantile (0.50, valueSet);
thisCol[] = thisValue;
thisCol = Column(sumdt, thisName||"_Q75");
thisValue = Quantile (0.75, valueSet);
thisCol[] = thisValue;
thisCol = Column(sumdt, thisName||"_Q90");
thisValue = Quantile (0.90, valueSet);
thisCol[] = thisValue;이것은 가끔 일합니다! 그러나 때로는 sumdt 열의 모든 데이터가 동일한 값이며, 때로는 아무것도 나오지 않는 경우가 있습니다.
나는 몇 가지 recommand wait (0) 명령을 알고 있지만 누군가가 그것을 보장하지 않습니다 말하는 읽습니다.
그러면 계산이 완료되었는지 어떻게 알 수 있습니까 ??
감사!
다시 : 동기화 모드?AAARGH!
나는 그 문제를 발견했다. 그것은 ... 들어오는 데이터!
일부 파일의 일부 열은 시작 부분의 주요 열과 동일한 이름을 가지고있는 것으로 나타났습니다. 단 하나의 값으로 다른 숫자 (스트립)를 사용했기 때문에 통계가 나타납니다.
오도 된 것에 대해 깊은 사과드립니다! 나는 여전히 좋은 습관에 대해 배웠습니다. 그래서 감사드립니다.
지원해 주신 모든 분들께 감사드립니다!
다시 : 동기화 모드?나 자신에게 응답 :
아니, 통계 함수가 아니에요, 값을 가져 오는 방법입니다. 숫자의 집합이 잘못되었습니다.
다시 : 동기화 모드?둘 다 고쳤고 내 문제가 변하지 않았습니다.
나는 더 이상 그것이 경쟁 조건이라고 믿지 않습니다. 동일한 체계의 데이터 세트에서 동일한 장소에서 매우 체계적이고 일어납니다. 항목 순서를 뒤섞거나 한 번에 하나의 항목으로 범위를 축소하려했는데 첫 번째 계산으로 std dev을 넣고 요소 순서를 변경했습니다. 출력에 똑같은 숫자가 여전히 잘못되었거나 누락되었습니다.
12.1 통계 함수에 알려진 버그가 있습니까?
다시 : 동기화 모드?- 그 현재 데이터 테이블 (dt); 필요에 따라 명시적인 dt를 사용하십시오. JSL이 실행되는 동안 테이블을 클릭하면 현재 데이터 테이블이 변경 될 수 있습니다.
- 현재 행을 설정하지 않으면 열 [/ * 아래 첨자가없는 빈 대괄호 * /]를 사용하지 마십시오. empty []는 "현재 행"을 의미합니다. 빈 대괄호는 일반적으로 필요하지 않습니다. 귀하의 예제는 아마도 명시적인 행 subscript가 필요합니다.
다시 : 동기화 모드?안녕 다시,
귀하의 답변과 통찰력에 감사드립니다.
불행히도, 나는 여전히 동일한 이슈를 가지고있다 : 누락 된 값, 출력 세트의 중복 값 (Q10에서 Mean, StdDev 누락).
나는 여러 가지 것을 시도했다. 나는 "수동으로"비정상적인 값의 몇 가지를 확인하기 위해 측면에 아래 첨자를 만들었고 그들은 잘 나왔다.
나는 많은 "wait"문장을 추가했다.
나는 아이디어가 아주 부족해!
다음은 스크립트입니다 (거의 모든 것, 열의 존재 여부에 대한 검증을 제거한 것 등).
Names Default To Here(1);
dt = Current Data Table();
colNames = dt << Get Column Names (String);
Summarize(itemsList = by("Item"));
binsList = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D"};
colNamesSum = sumdt << Get Column Names (String);
For (k=1, k <= Nitems(itemsList), k++,
itemID = itemsList[k];
dt << Select All Rows << Exclude(0);
dt << Select Where (dt:Item == itemID);
itemRows = dt << Get Selected Rows;
prodID = Right(Column (dt, "proc_id")[itemRows[1]],4);
lotID = Regex(Column(dt, "lot_id")[itemRows[1]], "\d{6}");
show(lotID,itemID);
checkDup = sumdt << Get Rows Where (:Lot == lotID & :Item == itemID);
If(NRows(checkDup) == 0,
newIt = 1;
show(newIt);
sumdt << AddRows(1);
Column(sumdt, "Test Date")[] = Column(dt, "finish_t")[itemRows[1]];
Column(sumdt, "Item")[] = itemID;
Column(sumdt, "N ")[] = NRow(itemRows);
Column(sumdt, "Product")[] = prodId;
Column(sumdt, "Lot")[] = lotID;
dt << Invert Row Selection << Exclude(1);
Current Data Table(dt);
Summarize(bins = by(:SBIN_NUM), countTable = count());
dt << Select All Rows << Exclude(0);
Current Data Table(sumdt);
For (i=1, i <= Nitems(binsList), i++,
binPos = Contains(bins, binsList[i]);
Column(sumdt, "Bin"||binsList[i])[] =
If(binPos == 0, 0, countTable[binPos]);
);
colNamesSum = sumdt << Get Column Names (String);
For (i=1, i<= Nitems(colList), i++,
thisName = colNames[colList[i]];
show(thisName);
valueSet = Column(dt, colList[i])[itemRows];
thisValueQ10 = Quantile(0.10, valueSet);
wait(0);
thisValueQ25 = Quantile (0.25, valueSet);
wait(0);
thisValueQ50 = Quantile (0.50, valueSet);
wait(0);
thisValueQ75 = Quantile (0.75, valueSet);
wait(0);
thisValueQ90 = Quantile (0.90, valueSet);
wait(0);
thisValueMean = Mean (valueSet);
wait(0);
thisValueStdDev = Std Dev (valueSet);
wait(0);
show(thisValueStdDev);
thisColQ10 = Column(sumdt, thisName||"_Q10");
thisColQ25 = Column(sumdt, thisName||"_Q25");
thisColQ50 = Column(sumdt, thisName||"_Q50");
thisColQ75 = Column(sumdt, thisName||"_Q75");
thisColQ90 = Column(sumdt, thisName||"_Q90");
thisColMean = Column(sumdt, thisName||"_Mean");
thisColStdDev = Column(sumdt, thisName||"_StdDev");
thisColQ10[] = thisValueQ10;
thisColQ25[] = thisValueQ25;
thisColQ50[] = thisValueQ50;
thisColQ75[] = thisValueQ75;
thisColQ90[] = thisValueQ90;
thisColMean[] = thisValueMean;
thisColStdDev[] = thisValueStdDev;
);
show("Item completed"),
newIt = 0;
show(newIt);
show("Item already exists in summary table!");
New Window("WARNING",
<< modal,
Text Box("Item "||lotId||"-"||itemID||" already in the table"),
Text Box("Skipping this item"),
Button Box("OK")
);
);
);
show("Lot completed");
sumdt << Save();다시 : 동기화 모드?마지막 회신에서 필자는 동기화 문제를 반드시 강조하지 않는 작은 테이블을 사용했습니다. 지연이 있으면 그것은 quantile의 계산이 될 것입니다. 아래 코드는 1,000 만 개의 데이터 요소에 대한 분위수를 계산합니다. 이 함수는 예상대로 동기식으로 실행됩니다. 즉, q 값이 설정 될 때까지 실행되지 않습니다. 동기화 문제가 있다면 q 값이 0으로 표시됩니다.
vals = J(10000000,1,Random Normal());
q = 0;
q = Quantile(0.5,vals);
show(q);
일반적인 관찰로서 동기화를 원할 경우 Wait (0)을 사용합니다. 이는 일반적으로 I / O 유형 문제에만 관련됩니다. Wait가 작동하지 않는 경우는 드뭅니다. 이는 실행이 별도의 스레드에서 실행되기 때문입니다.
다시 : 동기화 모드?문제를 복제 할 수있는 몇 가지 샘플 코드를 제공 할 수 있다면 진단하는 것이 훨씬 쉽습니다. 그것 없이는 나는 내 자신의 버전을 썼다. 그것은 모든 코드를 포함하고 있지만 테이블 원본과 대상 (sumdt)을 제공했습니다. 유일한 차이점은 thisCol []이라는 표기법을 사용한다는 것입니다.이 표기법은 For Each Row 루프를 사용한다는 의미입니다. 그 컨텍스트를 이해하지 못했기 때문에 For 루프를 사용했습니다.
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colList = dt << Get Column Names(string,numeric);
N = NItems(colList);
sumdt = new table("sumdt",
Add Rows(N),
new column("name", character),
new column("Q10"),
new column("Q25"),
new column("Q50"),
new column("Q75"),
new column("Q90"),
);
selRows = dt << Get Rows Where(:sex=="F");
For (i=1,i<=N,i++,
thisName = colList[i];
Column(sumdt,"name")[i] = thisName;
thisCol = Column(sumdt, "Q10");
valueSet = Column(dt, colList[i])[selRows];
thisValue = Quantile(0.10, valueSet);
thisCol[i] = thisValue;
thisCol = Column(sumdt, "Q25");
thisValue = Quantile (0.25, valueSet);
thisCol[i] = thisValue;
thisCol = Column(sumdt, "Q50");
thisValue = Quantile (0.50, valueSet);
thisCol[i] = thisValue;
thisCol = Column(sumdt, "Q75");
thisValue = Quantile (0.75, valueSet);
thisCol[i] = thisValue;
thisCol = Column(sumdt, "Q90");
thisValue = Quantile (0.90, valueSet);
thisCol[i] = thisValue;
);
이 코드는 동기화 문제없이 잘 작동합니다. 코드를 비교하고 다른 코드를 확인하는 것이 좋습니다.
다시 : 동기화 모드?루프를 사용해 볼 수도 있습니다. 다음 루프가 시작되기 전에 값을 행렬 또는 연관 배열에 복사하는 단계를 루프에 통합 할 수 있습니다. 아마 당신이 원하는 종지를 따라 잡을 수 있습니다.
베스트,
엠