你好,
我試圖根據以下標準用循環繪製分佈:
- 需要僅繪製至少具有 1x 規格限制(LSL 或 USL)的列
- 需依參數拆分選定的欄位(SplitBy)
我使用 Eval(EvalExpr()) 來建立我需要的表達式,但我正在努力使用Where()函數來按所選列進行拆分。
我提取了失敗的程式碼部分,並在開始時添加了一個虛擬表創建,以便可以複製問題。
我的試驗有 3 個選項可以透過註解/取消註解來複製下面程式碼中的問題。
我的目標是建立一個表達式,在Where()中正確調用變數“SplitBy”,如下面的選項1所示(但“:CONFIG1”在選項1中是硬編碼的)
我的嘗試選項 2 和 3(以及其他...)失敗了(日誌摘錄如下)
Option 1:
dis = dt << Distribution(Continuous Distribution(Column("LogNormal 10,1"n)), Where(:CONFIG1 == “1"))
Option 2:
dis = dt << Distribution(Continuous Distribution(Column("LogNormal 10,1"n)), Where(Column("CONFIG1") == "1"))
This Where-clause for data table 'tabletest.jmp' resulted in no rows: Column( "CONFIG1" ) == "1"
Option 3:
dis = dt << Distribution(Continuous Distribution(Column("LogNormal 10,1"n)), Where(":CONFIG1" == "1"))
This Where-clause for data table 'tabletest.jmp' resulted in no rows: ":CONFIG1" == “1"我知道表達式評估是這個論壇中反覆出現的話題,但我花了很多時間試圖讓它發揮作用,但仍然沒有成功:\
預先非常感謝
牧師
Names Default To Here( 1 );
clear symbols();
Deletesymbols();
//Create table with random distribution
dt = New Table( "tabletest",
Add Rows( 150 ),
New Column( "LogNormal 10,1", Numeric, "Continuous", formula( Random Lognormal( 10, 1 ) ) ),
New Column( "Normal 10,1", Numeric, "Continuous", formula( Random Normal( 10, 1 ) ) ),
New Column( "Gamma 10,1", Numeric, "Continuous", formula( Random Gamma( 10, 1 ) ) ),
New Column( "Normal 10,2", Numeric, "Continuous", formula( Random Gamma( 10, 2 ) ) ),
New Column( "CONFIG1", Character, "Nominal", formula(char(Random Integer( 1, 3 )))),
New Column( "CONFIG2", Character, "Nominal", formula(char(Random Integer( 1, 3 ))));
);
Column( dt, "LogNormal 10,1" ) << set property( "spec limits", {LSL( 0 ), USL( 400000 ), Show Limits( 0 )} );
Column( dt, "Normal 10,1" ) << set property( "spec limits", {LSL( 6 ), USL( 14 ), Show Limits( 0 )} );
Column( dt, "Gamma 10,1" ) << set property( "spec limits", {LSL( 0 ), USL( 40 ), Show Limits( 0 )} );
dt << save( "$Desktop\tabletest.jmp" );
SplitBy = "CONFIG1";
//Get a list from all unique configs
summarize(ColumnSplitBy=by(Column (SplitBy)));
show(ColumnSplitBy);
For( i = N Items( ColumnSplitBy ), i > 0, i--,
If( ColumnSplitBy[i] == "",
Remove From( ColumnSplitBy, i, 1 );
)
);
//Get Column only with limits (At east LSL or USL, I don't care about target)
MetricCols = dt << Get Column Names( numeric, continuous );
Show( MetricCols );
For( i = N Items( MetricCols ), i >= 1, i--,
Q = Column( MetricCols[i] ) << Get Property( "Spec limits" );
Show( Q );
spec_x = Eval List( {Arg( Q, 1 )/*, Arg( Q, 2 ), Arg( Q, 3 )*/} );
Show( spec_x );
If( N Row( Loc( spec_x, Empty() ) ),
Remove From( MetricCols, i )
);
);
k=1;
//Loop to run through all configs
For ( j = 1, j <= N Items( ColumnSplitBy ), j++,
Show( j );
//Loop to run Distribution > Fit ALL > Capability and collect the stats
For( i = 1, i <= N Items( MetricCols ), i++,
Show( i );
////////////////////////////////////////////////////// Option 1: That works well, but :CONFIG1 is hardcoded
x = Eval Expr(
dis = dt << Distribution(
Continuous Distribution( Column( Expr(MetricCols[i] ))),
Where(:CONFIG1 == Expr(ColumnSplitBy[j])))
);
print (x);
Eval (x);
/* ////////////////////////////////////////////////////// Option 2 : That doesn't work
x = Eval Expr(
dis = dt << Distribution(
Continuous Distribution( Column( Expr(MetricCols[i] ))),
Where(Expr(Column(SplitBy)) == Expr(ColumnSplitBy[j])))
);
print (x);
Eval (x); */
/* ////////////////////////////////////////////////////// Option 3 : That doesn't work
x = Eval Expr(
dis = dt << Distribution(
Continuous Distribution( Column( Expr(MetricCols[i] ))),
Where(Expr(":"||SplitBy) == Expr(ColumnSplitBy[j])))
);
print (x);
Eval (x); */
);
);我相信這對你有用
x = Eval Expr(
dis = dt << Distribution(
Continuous Distribution( Column( Expr(MetricCols[i] ))),
Where(as column(SplitBy) == Expr(ColumnSplitBy[j])))
);