如何使用列值作为脚本中公式的输入?全部,
我相信我的问题非常基本,但我还没有找到答案。
我有一个数据表,如下所示

我希望
a) 包括 3 个标记为 %CFB 第 3 列的新列, %CFB 第 4 列和%CFB 第 5 列。 %CFB 代表相对于基线的变化百分比。
b)在每个新列中,我希望输入与基线相比的变化百分比以及从以下公式得出的值
%CFB = (x - 第 3 列)/第 3 列,其中“x”将在下面编码的每次迭代中替换为第 3、4 或 5 列中的值。第 3 列是基线值
dt = Current Data Table();
startcol = 3;
endcol = 5;
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
New column ("%CFB " || data_col) << Formula((( :data_col - :column 3) / :column 3) * 100 ));
使用上面的脚本我已经能够创建新列,但没有将公式的结果放入其中。当我手动交换时第3栏为了数据列在公式中,所有新列都按我的预期计算为零。这告诉我该公式至少是正确的,并且 data_col 变量没有按照我的意愿进行解释/替换。任何有关使其发挥作用的见解将不胜感激。
提前感谢你的帮助
弗洛伊德·福克斯
回复:如何使用列值作为脚本中公式的输入?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />不知道有多少意见值得欢迎,但就这样吧。
就我个人而言,我是 Eval(Parse()) 的巨大反对者,因为它大大降低了编辑器内的可读性。我见过 5000 行脚本,大部分都是粉红色的(或者你为字符串选择的任何颜色)。通过替换表达式的能力,您可以保持语法突出显示完整,并且我认为这可以使编辑其他人的脚本变得更加容易。
我仍然偶尔使用 eval(parse()),但在必要时我会尝试使用 JSL quote()。
回复:如何使用列值作为脚本中公式的输入?关于处理范围的优秀说明王克将它们全部包装在一起弗洛伊德福克斯FB带有一些代码格式。
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
new_col_name = "%CFB " || data_col;
Eval(
Eval Expr(
dt << New Column( Expr(new_col_name),
Numeric,
Continuous,
Formula( ((Column( dt, Expr( data_col ) )[] - :column 3) / :column 3) * 100 )
)
)
);
);
变量范围的另一个解决方法是使用 Set Each Value(equation) 而不是 Formula(equation)。这样做的好处是使用较少的资源,因为不计算公式,但它的缺点是修改所述公式会造成损失。
与任何好的事情一样,有很多方法可以使用正确的工具来解决问题。正如您提到的,当事情开始变得更高级时,Substitute() 也是一个不错的选择。Substitute 与 Parse() 结合使用特别有用,Parse() 将字符串转换为 JSL 代码,而 Eval() 则允许执行 JSL,这会导致 Eval(Parse(Substitute())) 语句。当围绕内置 JMP 平台包装功能时,最后一项技术特别有用。为了进一步说明 parse() 和 eval(parse) 的组合,我提供了一个简单的示例。

快乐编码!
回复:如何使用列值作为脚本中公式的输入?你好,
在本示例中,变量 data_col 仍然出现在公式中。由于您在 For 循环中分配 data_col,因此循环完成后对公式求值的任何尝试都将在所有三个新列中产生相同的值。这是因为 data_col 将表示 For 循环中的最后一个值“第 5 列”。此外,假设您保存该表,然后关闭 JMP。当您在 JMP 的新实例中再次打开表并尝试计算公式时,将出现错误,因为 JMP 不再知道 data_col 应表示什么。
当您在公式中使用变量时,您需要执行一些操作来指示 JMP 在计算公式之前将变量替换为其值。您可以使用 Substitute(),但我发现 Eval Expr() 方法(如文斯.法勒0提到的)对于大多数人来说更容易实现。Eval Expr() 告诉 JMP 计算(替换)您作为参数提供的表达式中包含在 Expr() 函数中的任何变量。 外部 Eval() 将导致 JMP 在替换发生后评估整个 New Column 语句。JMP 使用说明41824也体现了这个概念。
我希望这有帮助。
温蒂
回复:如何使用列值作为脚本中公式的输入?文斯,
这次真是万分感谢。坦率地说,我必须阅读您提供的表达式,但我非常感谢您对我的代码不起作用的原因的洞察。
问候
弗洛伊德
回复:如何使用列值作为脚本中公式的输入?内特,
感谢这个代码的工作,并且有一个额外的好处,我可以理解代码背后的逻辑。
弗洛伊德
回复:如何使用列值作为脚本中公式的输入?文斯.法勒0确实准确地找出了问题的根源。数据表中没有名为 data_col 的列。因此,所编写的代码引用了不存在的东西。此外,Vince 还展示了一些使用 JSL 编写代码来保存动态引用的强大方法。也就是说,在任何好的语言中,您都会有多种选择来执行逻辑。
我建议使用另一种引用该列的格式。虽然简单的格式是使用分号和列名来引用当前数据表的列,但更强大的方法是使用列(数据表引用、列字符串或数字)格式。下面我稍微修改了您的代码以使用该格式。
dt = Current Data Table();
startcol = 3;
endcol = 5;
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
col_name = "%CFB " || data_col;
dt << New Column(col_name,
Numeric,
Continuous,
Formula( ((column(dt, data_col)[] - :column 3) / :column 3) * 100 ) );
);
回复:如何使用列值作为脚本中公式的输入?你不能做 :variable (尤其是字符串,这是 <
如果你把它改成
data_col = Column( i ) ;
Eval(EvalExpr(New column ("%CFB " || Expr(data_col<<GET name=""></GET>
它应该有效。
它只是用实际值而不是变量替换 EvalExpr() 中的所有 Expr()。