你好,
有人能帮我提供一个 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() 并创建具有足够行的集合。