為臨時變量創建公式大家好,
我對 JMP 腳本編寫還是新手。 我需要幫助來創建一個公式,使該值作為變量但具有自己的名稱。 我的意思如下。 所以,我想創建一個公式,可以使下面的第 4 列作為分佈圖的變量。
就像塑料 = 0.424542
現在的問題是公式名稱將相同,即 t4 = :TYPE;:MIN;。 因此,如果我想在分佈圖中繪製塑料的最小值,它將採用岩石的最小值,因為岩石的公式也是 t4。
那麼,我怎樣才能使公式使變量值變成
塑料=:類型;:最小;
紙= :類型;:最小值;
依此類推,那麼它已經可以是自變量了。如果有人可以提供幫助,我真的很感激。我已經在互聯網上查了幾個小時了。

回复:為臨時變量創建公式這是我的錯誤,我漏掉了一個“)”。試試這個代碼
Names Default To Here( 1 );
dt = Current Data Table();
// Only one set of Spec Limits per column can be set,
// therefore split the data into separate columns
// and set the separate limits for each column
dtSplit = dt << Split( Split By( :TYPE ), Split( :NUMERIC_RESULT ), Sort by Column Property );
// Get the names of the generated columns
colList = dtSplit << get column names( string );
// Loop across the columns and create the spec limits for each column
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
__col__ << set property(
"spec limits ",
{LSL( __LSL__ ), USL( __USL__ ), show limits( 1 )}
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] ),
Expr( __LSL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")-6*col std dev(dtSplit:" || colList[i
] || ")"
)
),
Expr( __USL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")+6*col std dev(dtSplit:" || colList[i
] || ")"
)
)
)
)
);
// Create a literal string that contains the JSL required to
// generate the Distributions
theExpr = "Distribution(
Arrange in Rows( 1 ),";
theExpr = theExpr || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[1] )
)
);
For( i = 2, i <= N Items( colList ), i++,
theExpr = theExpr || "," || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] )
)
);
);
theExpr = theExpr || ");";
// Run the generated code
Eval( Parse( theExpr ) );回复:為臨時變量創建公式嗨吉姆,
在這裡,我附上了表格來運行您提供的代碼,只需進行一些修改。 如果您運行此處編寫的腳本,則不會自動生成分佈圖。
我已經檢查了日誌並嘗試調試它出了什麼問題,但似乎我找不到它為什麼抱怨有錯誤。對我來說看起來不錯。
錯誤如下:
輸入意外結束。 也許缺少“,”或“)”。
嘗試解析函數“Distribution”的參數。
第 2 行第 560 列:...正態分位數圖(1));►...
回复:為臨時變量創建公式我提供的代碼也應該生成發行版。
您能否附上您正在運行的數據表的副本,以便我可以看到問題是什麼?...如果您查看日誌文件,您還應該看到問題是什麼。
回复:為臨時變量創建公式嗨吉姆,
是的,它適用於列中盡可能多的類型值,但在繪製分佈圖時,我仍然需要手動繪製它。
是否可以在計算完所有 TYPE 值的所有限制後自動繪製分佈圖?我嘗試手動繪製圖表以導出腳本,但似乎所有內容都被硬編碼為我僅在此處給出的示例表中的 TYPE 值。
TYPE 值也會時常不同。 因此,我需要避免 JSL 中的硬編碼行。
@tx尼爾森
回复:為臨時變量創建公式我編寫的代碼應該使用與數據表中找到的盡可能多的 TYPE 值。如果沒有,則為錯誤,需要更正代碼。
回复:為臨時變量創建公式我提供的代碼應該適用於在數據表中找到的盡可能多的 TYPE 值。
回复:為臨時變量創建公式嗨吉姆,
我的意思是在計算完所有限制後,它將直接繪製所有類型值的分佈圖以及計算的限制。 因此,我想通過使用腳本來完成此操作,但是當我在繪製所有類型分佈圖後嘗試導出腳本時,似乎所有類型圖都僅硬編碼到當前表。
意味著如果我有 TYPE 列的新項目,那麼它不會繪製分佈圖。 它只會在類型列中繪製這 4 個項目。
希望這能回答您的問題。如果您需要對此進行更多說明,請告訴我。謝謝!回复:為臨時變量創建公式@mhalwi
請您解釋一下“自動繪製分佈圖“?您是否希望 JMP 在打開新數據表時運行繪圖?或者,您是否希望 JMP 能夠識別某些系統上何時有新數據可用?
回复:為臨時變量創建公式嗨吉姆,
多謝!你的方法也很有效。 有機會使用 JSL 自動繪製分佈圖,而不是手動選擇繪製圖表嗎?回复:為臨時變量創建公式你好@朱利安,
兩種解決方案都效果很好!謝謝你!
關於替代方法的 1 個問題,我需要在表格拆分後手動繪製圖表。 由於 TYPE 列值總是會變化,是否有任何方法可以繪製所有列的分佈圖?
再次感謝你的幫助!!
回复:為臨時變量創建公式這是您嘗試生成輸出的不同方法......它利用 JMP 能夠將規格限製作為列屬性,並讓分發平台識別它們並在平台
Names Default To Here( 1 );
dt = Current Data Table();
// Only one set of Spec Limits per column can be set,
// therefore split the data into separate columns
// and set the separate limits for each column
dtSplit = dt << Split( Split By( :TYPE ), Split( :NUMERIC_RESULT ), Sort by Column Property );
// Get the names of the generated columns
colList = dtSplit << get column names( string );
// Loop across the columns and create the spec limits for each column
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
__col__ << set property(
"spec limits ",
{LSL( __LSL__ ), USL( __USL__ ), show limits( 1 )}
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] ),
Expr( __LSL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")-6*col std dev(dtSplit:" || colList[i
] || ")"
)
),
Expr( __USL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")+6*col std dev(dtSplit:" || colList[i
] || ")"
)
)
)
)
);
// Create a literal string that contains the JSL required to
// generate the Distributions
theExpr = "Distribution(
Arrange in Rows( 1 ),";
theExpr = theExpr || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[1] )
)
);
For( i = 2, i <= N Items( colList ), i++,
theExpr = theExpr || "," || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] )
)
);
);
theExpr = theExpr || ";";
// Run the generated code
Eval( Parse( theExpr ) );回复:為臨時變量創建公式你好@mhalwi ,
我完全明白你現在想做什麼。 如果在構建匯總表後插入以下 jsl,您將擁有為每個類型級別命名的 LSL 和 USL 變量(此處附有完整腳本,LSL USL - Original method.jsl):
For Each Row(Eval(Parse(Concat("LSL_",:Type," = ",Char(lower_limit)))));
For Each Row(Eval(Parse(Concat("USL_",:Type," = ",Char(upper_limit)))));
現在,當您為每個類型調用 Distribution 並構建參考線時,請將類型名稱附加到 LSL 和 USL。 例如,在“Paper”的調度中:
Dispatch(
{
"Distributions TYPE=Paper",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min(-0.6 ), Max( 1.2 ), Inc( 0.001 ), Minor Ticks( 0 ),
Add Ref Line( USL_Paper, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL_Paper, Solid, "Medium Dark Red", "", 2 )}
)
不過,這讓我開始思考。您願意採用稍微不同的方式來實現這一目標嗎? 另一種方法是,如果您拆分原始表,我們可以通過 jsl 將 LSL 和 USL 設置為列屬性。 然後,當您調用 Distribution() 時,可以自動繪製限制。 還附上了相應的 JSL(LSL USL - Alt method.jsl)。
這有幫助嗎?
@朱利安
回复:為臨時變量創建公式大家好,
你好@uday_guntupalli和@朱利安,
在這裡,我附上了示例表和 jmp 腳本,以便你們可以嘗試並了解我在這裡想要實現的目標。 只需更改計算機中數據表的路徑即可。
正如您在腳本中看到的,數據表的摘要中有一個公式(USL 和 LSL)。
因此,我現在需要做的是創建另一個公式,該公式可以獲取塑料等的 USL 值,並將其指定為 Plastic_USL = 0.4 之類的值。 然後我可以使用變量 (Plastic_USL) 使用 sendToReport 函數在塑料分佈圖中繪製。因此,“類型”列中的其他項目列表也是如此。
我不能直接使用 USL 變量,因為如果我使用它,它只會採用計算出的最後一個 USL 值(即 ROCK)並將其繪製在所有圖表(塑料、棉花、紙張、岩石)中。 那麼 USL 線將僅對於 1 個圖形是正確的,而對於其餘圖形則是錯誤的。
我一直在尋找一種方法來做到這一點,但無處可去,真的需要你們的幫助。 在這裡非常感謝你們的幫助!
dt = Open ("C:\*\data_table.csv");
Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :NUMERIC_RESULT ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Count Axis( 1 ),
Normal Quantile Plot( 1 )
),
By( :TYPE );
);
Summary(
Group(:TYPE ),
Mean( :NUMERIC_RESULT ),
Std Dev( :NUMERIC_RESULT )
);
New Column( "lower_limit",
Numeric,
Continuous,
Format( "Best", 8 ),
Formula(
LSL = :Name( "Mean(NUMERIC_RESULT)" ) - 6 *:Name( "Std Dev(NUMERIC_RESULT)" )
),
);
New Column( "upper_limit",
Numeric,
Continuous,
Format( "Best", 8 ),
Formula(
USL = :Name( "Mean(NUMERIC_RESULT)" ) + 6 *:Name( "Std Dev(NUMERIC_RESULT)" )
),
);
wait (1);
dr = Fit Group (
Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :NUMERIC_RESULT ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Count Axis( 1 ),
Normal Quantile Plot( 1 )
),
By( :TYPE )
);
SendToReport(Dispatch({"Distributions TYPE=Cotton","NUMERIC_RESULT"},"1",ScaleBox,
{Min( LSL - 1 ), Max( USL + 1 ), Inc( 0.005 ), Minor Ticks( 1 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 )}
)
);
SendToReport(
Dispatch(
{
"Distributions TYPE=Paper",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min(-0.6 ), Max( 1.2 ), Inc( 0.001 ), Minor Ticks( 0 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 )}
)
);
SendToReport(
Dispatch(
{
"Distributions TYPE=Plastic",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min( 0.1 ), Max( 0.4 ), Inc( 0.005 ), Minor Ticks( 0 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 )}
)
);
SendToReport(
Dispatch(
{
"Distributions TYPE=Rock",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min( 0.01 ), Max( 3.5 ), Inc( 0.01 ), Minor Ticks( 0 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 )}
)
);
)<<REPORT></REPORT>
回复:為臨時變量創建公式你好@mhalwi ,
我不確定你到底在問什麼,但我有兩個猜測,所以希望其中一個是正確的!
第一個猜測:您是否正在嘗試構建一個公式,該公式將返回一個類型為文本的列,然後是等號,然後是 min 列中的值? 公式列中的以下公式將實現此目的:
Concat(:Type," = ",Char(:Min))
並返回一個像這樣的表:
我附上了示例表,以防有幫助。
第二個猜測:您想要將以 type 列中的單元格命名的新變量設置為 min 列中的值。 或者換句話說,您想要評估上表第 4 列中的文本。 如果這就是您所追求的(並且您已經製作了此表),您可以運行以下 jsl:
For Each Row(Eval(Parse(:Column 4)));
但是,僅僅為了評估而創建該專欄可能並不是最節儉的方法。 如果這是您想要執行的操作,則以下命令將設置這些變量而不創建該公式列:
For Each Row(Eval(Parse(Concat(:Type," = ",Char(:Min)))))
我希望這兩個答案之一有幫助!
@朱利安
回复:為臨時變量創建公式@mhalwi ,
我不確定我是否理解你想要做什麼。 不過,我會嘗試根據我所理解的進行解釋。
下面顯示的是我對你想要做的事情的解釋。 本質上繪製數據的分佈,以便能夠看到您的類型的最小值。 我認為下面所示的圖表可以實現這一點。
如果這不是您想要的,您能否提供一些您正在嘗試做的事情的屏幕截圖(在 Excel 中完成),以便社區可以幫助您實現您想要實現的目標?
