同步模式?大家好,
我正在努力與JMP / JSL的異步部分。現在我明白你可以使用“Run Formulas()”在使用之前強制評估一個公式,但是我遇到了與其他函數類似的問題:
使用該值時,可能不正確。這非常危險!
是否存在“強制同步模式”,其中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列中的所有數據都是相同的值,有時候根本就沒有任何數據。
我知道有人建議使用wait(0)命令,但是我讀到有人說這也不是保證。
那麼如何確保計算完成?
謝謝!
Re:同步模式?AAARGH!
我發現了問題,那是...... 傳入的數據!
我想一些文件上的一些列的名稱與開頭的主要名稱相同,只是有一個不同的數字(我剝離),但只有一個值,所以有統計數據!
我對這種誤導性深表歉意!我還是學習了很好的練習,所以我很感激。
謝謝大家的支持!
Re:同步模式?回答自己:
不,這不是統計函數,而是我獲取值的方式。這組數字出錯了。
Re:同步模式?我修復了兩個,並沒有改變我的問題。
我不再相信這是一場競爭。它非常系統化,並且在同一組數據上發生在同一個地方。我試圖改變項目順序或將範圍縮小到一個項目,將std dev作為第一個計算,更改元素順序,並且我仍然在輸出中有相同的確切數字錯誤或缺失。
12.1統計函數是否存在已知錯誤?
Re:同步模式?- 除掉當前數據表(dt); 並在需要時使用顯式dt。如果在JSL運行時單擊表,則當前數據數據可能會更改。
- 除非設置當前行,否則不要使用列[/ *空括號而沒有下標* /]。空[]表示“當前行”。通常不需要空括號。您的示例可能需要顯式行下標。
Re:同步模式?你好,我們又見面了,
感謝您的回答和見解。
不幸的是,我仍然有同樣的問題:缺少值,輸出集中的重複值(從Q10到Mean,缺少StdDev)。
我嘗試過多種方法。我在旁邊做了一個下標來“手動”檢查一些異常值,它們很好。
我添加了許多“等待”聲明。
我完全沒有想法!
這是腳本(幾乎全部,刪除了一些有關列的存在的驗證,等等,它足夠大):
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();Re:同步模式?在我上次的回復中,我使用了一個小表,不一定會突出顯示任何同步問題。 如果有延遲,它將是分位數的計算。 下面的代碼計算了1000萬個數據點的分位數。 該函數按照您的預期同步運行,即在q的值建立之前,show不會執行。 如果存在同步問題,那麼我們會看到q的值顯示為零。
vals = J(10000000,1,Random Normal());
q = 0;
q = Quantile(0.5,vals);
show(q);
但是作為一般觀察,如果我想確保同步,我會使用Wait(0) - 這通常只與I / O類型問題有關。只有極少數情況下Wait不起作用 - 這是因為執行是在一個單獨的線程中運行的。
Re:同步模式?如果您可以提供一些我們可以運行的示例代碼來複製問題,那麼診斷會容易得多。 沒有它我就寫了我自己的版本。 它包含您的所有代碼,但我提供了表源和目標(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;
);
此代碼工作正常,沒有任何同步問題。 您可能希望比較代碼並查看不同之處。
Re:同步模式?你可以嘗試使用循環。您可以在循環中合併一個步驟,在下一個循環開始之前將值複製到矩陣或關聯數組。這可能會讓事情跟隨你想要的節奏。
最好,
中號