你好,
有人可以幫我編寫一個 JSL 代碼,它會在列屬性中生成一個帶有公式的新表嗎?
公式的表大小、列名和參數來自一個外部 jmp 文件,如附加的。
有人可以分享一些代碼片段,如何開始?
刪除第 1 列在腳本中很容易,所以應該不是問題。 我要么創建具有特定名稱的列,要么使用索引將其刪除
Names Default To Here(1);
dt = New Table("testtable", add rows(1),
new column("REMOVETHIS")
);
wait(1); //for demonstration purposes<BR />//dt << Delete Column(1);
dt << Delete Columns("REMOVETHIS");如果您不需要公式,則使用 Set Each 值會更好,因為它更快。
為了學習... Eval(EvalExpr()) 絕對不是最容易理解的東西,但有些內容可能會有所幫助。 快速檢查我發現了這些:
實際的腳本會生成一個未定義的列“Column 1”。
並且在 New Table () 中生成列不會創建這樣的列。 這只是化妝品...
同時,我有一個腳本,它具有單列定義,其他的被添加到新列之外。
並且新生成的表具有正確的計算值。 但是,如果我查看公式內部,則它包含腳本中的表達式。
我可以通過使用來掩蓋這個事實設置每個值()。 但這讓我發瘋...... 
現在我很想知道為什麼表達式沒有被正確評估。 我沒有成功使用 Eval () Eval Expr() 和 Expr()。 我相信不了解它們的功能,但與公式結合,沒有機會。
但是,您的建議解決了我最初的問題。 謝謝!
是否有特定原因要在 New Table() 中創建列? 我不確定它是否可能,如果是的話,與在 New Table() 之後創建它們相比,它很可能會使代碼更混亂。
謝謝! 它與下面的代碼一起使用。 它對我幫助很大!!
但是,我現在有動力學習一點 JSL。 我對可能的實施進行了討論。 第二個代碼。
Clear Globals();
Names Default To Here( 1 );
//mydt =
//Data Table( "dt_RandomNormalParameter" ) <<
mydt = Current Data Table();
// New data table
my_newdt = New Table( "Table Name", Add Row ( 1000 ));
//lets use formulas, we can easily add more rows if needed
For Each Row(
mydt,
columnName = As Column(mydt, "Analysis Columns");
meanValue = As Column(mydt, "Mean");
stdDevValue = As Column(mydt, "Std Dev");
//use eval expr to get values in formula
Eval(Eval Expr(my_newdt << New Column(columnName, Numeric, Continuous, Formula(Random Normal(Expr(meanValue), Expr(stdDevValue))))));
);
// Code adds Column "Column 1"
我的概念來解決我的問題:
Clear Globals();
Names Default To Here( 1 );
mydt = Current Data Table();
// New data table
my_newdt = New Table( "Table Name",
Add Rows (N Rows ( mydt )), // row count can be set by hand e.g. 1000
//For ( i = 1, i <= N Rows ( mydt ), i++, // for loop is not executed
New Column( Column(mydt, 1 )[1] , // Loop i==1
Numeric,
"Continuous",
Format( "Best", 6 ),
Formula( Random Normal( Column(mydt, :Mean )[1], Column(mydt, :Std Dev )[1] ) )// Column(mydt, :Mean )[1] is not evalueted
),
New Column( Column(mydt, 1 )[2] , // Loop i ==2
Numeric,
"Continuous",
Format( "Best", 6 ),
Formula( Random Normal( Column(mydt, :Mean )[2], Column(mydt, :Std Dev )[2] ) )//// Column(mydt, :Mean )[1] is not evalueted
)
//)// for loop
)// New data table不幸的是,我不知道如何在“新表”中使用“for 循環”並在公式中使用 evaluete 索引。
我假設 Eval、Eval Expr 的一些方法。
但我不明白語法。
你相信我的概念也可以使用正確的語法嗎?
需要修改什麼?
您可以使用 For Each Row 循環遍歷 RandomNormal_dt.jmp,然後從列中獲取值。 利用Eval(EvalExpr()) 將值添加到公式。
Names Default To Here(1);
dt_random = New Table("RandomNormal_dt",
Add Rows(20),
New Column("Analysis Columns",
Character(6),
"Nominal",
Set Values(
{"Name1", "Name2", "Name3", "Name4", "Name5", "Name6", "Name7", "Name8", "Name9", "Name10", "Name11", "Name12", "Name13", "Name14","Name15", "Name16", "Name17", "Name18", "Name19", "Name20"}
),
),
New Column("Mean", Numeric, "Continuous", Format("Best", 6), Set Values([1, 1, 0, 0, 0, 2, 2, 3, 3, 5, 10, -5, -6, 3, 3, 3, 3, 3, 0.5, 0.5]), ),
New Column("Std Dev",
Numeric,
"Continuous",
Format("Best", 6),
Set Values(
[0.0059167075785471, 0.00455419279075633, 0.00421951193571742, 0.00421951193571742, 0.00440945078910684, 0.00440945078910684,
0.0102216984358101, 0.00419398115162298, 0.0808821732109718, 0.0876924473662647, 0.119338972830502, 0.0918654224334168,
0.0921864791037008, 0.0868549769597964, 0.0808821732109718, 0.0865262154672911, 0.186459394109712, 0.189566585675401, 0.0876924449303901,
0.0434724818197371]
),
)
);
//create collection table
dt = New Table("Analysis");
//lets use formulas, we can easily add more rows if needed
For Each Row(
dt_random,
columnName = As Column(dt_random, "Analysis Columns");
meanValue = As Column(dt_random, "Mean");
stdDevValue = As Column(dt_random, "Std Dev");
//use eval expr to get values in formula
Eval(Eval Expr(dt << New Column(columnName, Numeric, Continuous, Formula(Random Normal(Expr(meanValue), Expr(stdDevValue))))));
);

然後您可以根據需要添加行。添加行後,您可以根據需要刪除公式以使數據表更快。 如果您知道需要多少行,則可以將 Formula() 替換為 << Set Each Value() 並創建具有足夠行的集合。