通过引用变量来调用列这里是一个完全的新手,
在旧帖子中找不到解决方案,
我创建了一个包含现有列名称的变量。 我想创建一个新列,将对其他两列的数据进行求和(通过变量调用列)。变量的用法是为了稍后在 for 循环中使用。
感谢您的帮助!
对于以下代码:
dt = Current Data Table();
columnname1 = Column( dt, 1 ) << Get Name;
columnname2 = Column( dt, 2 ) << Get Name;
dt << New Column( "new_" || columnname1, Numeric , continuous, formula(column(dt, columnname1)+column(dt, columnname2)));
我收到以下错误:
列 new_Column 1 2 公式中断
无法将参数转换为数字 [或矩阵] 1 次 At rows: 2 操作: Add, Column( dt, columnname1 ) + /*###*/Column( dt, columnname2 ) /*###*/
公式计算错误已被忽略
列(“new_Column 1 2”)
高级统计建模数据存取数据混合和清理数据探索和可视化回复:通过引用变量调用列@tx尼尔森这一点是非常正确的。我建议的方法是一个懒惰的选择,事后看来不是我推荐的方法。如果您只想要一个具有正确值的列,您可以在循环中进行计算,而不必费心使用公式;如果公式对您很重要,那么您需要检查您的脚本是否正确编码了公式 - 数字显示正确还不够。脚本变量不会在脚本的生命周期之外持续存在,因此公式需要正确包含列引用 - 这是通过使用表达式替换技术(例如 Jim 所演示的技术)来实现的。
回复:通过引用变量调用列感谢您的快速答复。有用!
回复:通过引用变量调用列你可以让它工作,用
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
columnname1 = Column( dt, 4 ) << Get Name;
columnname2 = Column( dt, 5 ) << Get Name;
dt << New Column( "new_" || columnname1,
Numeric,
continuous,
formula(
As Column( dt, columnname1 ) + As Column( dt, columnname2 )
)
);
然而,这有一个潜在的问题。存储的公式为:

只要您的 JMP 会话有效,此公式就会继续有效
- 已定义变量 dt、columnname1 和columnname2。如果您保存数据表,关闭 JMP,然后明天您进来启动 JMP,并打开数据表,会发生什么情况。该公式将找不到这些变量,并且该公式将失败。
- 在会话内,变量 dt、columnname1 和columnname2 不会更改其值。因此,如果您创建此列,并稍后在脚本中更改变量columnname1的值,因为JMP数据表中的公式列是动态的,当数据表发生更改时,公式将重新运行,JMP将使用变量的新值,并将为公式列创建新值。
您真正需要做的是使用一种方法来为公式创建实际的 JSL 语法。在上面的示例中,您真正想要的是公式为
:height + :weight
下面的 JSL 是实现此目的的一种方法。它使用 Substitute() 函数将实际的列名称植入到公式中。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
columnname1 = Column( dt, 4 ) << Get Name;
columnname2 = Column( dt, 5 ) << Get Name;
Eval(
Substitute(
Expr(
dt << New Column( "new_" || columnname1,
Numeric,
continuous,
formula( __c1__ + __c2__ )
)
),
Expr( __c1__ ), Parse( ":" || columnname1 ),
Expr( __c2__ ), Parse( ":" || columnname2 )
)
);回复:通过引用变量调用列您已经创建了引用列的变量。您可以在公式中使用它们,但需要使用 AsColumn 函数:
formula( AsColumn(columnname1) + AsColumn(columnname2) )
回复:通过引用变量来调用列仅针对这个问题的未来读者:
我使用上述代码将字符串列名称传递给公式,但在使用时遇到了问题
Parse(":" || column_name)解析容易受到奇数列名的影响,因为像“a - b”这样的列名会被解释为列“a”减去变量“b”。
相反使用
As Name(columnname)
解决了这个问题。