名称引用一个奇怪的列名我正在尝试将列名插入到拟合模型表达式中。 为此,我需要转义列名中的奇怪字符,我们使用 :"name"n 约定。 那么如何从字符串列名转换为这种格式呢?
colListY = {"Plating Thickness (m\!"\!")"};
//This doesn't work
newcolumnref = eval insert("\[:"^colListY[1]^"n]\");
//Looking for this end result
:"Plating Thickness (m\!"\!")"n然后我可以在任何地方插入,例如:
insert into(expr(Y()), newcolumnref);
任何人都知道一个强大的方法来做到这一点?
脚本回复:名称引用一个奇怪的列名colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
Eval(
Eval Expr(
dt << New Column( "test",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 2 ),
Formula( Column( Expr( colListY[1] ) )[] ),
Set Display Width( 78 )
)
)
);空的 [ ] 告诉 JMP 评估当前行的列。
像这样构建列公式可能会隐藏 JMP 公式评估器的基础列依赖关系;看讨论. 如果您的公式列依赖于其他公式列,则 JMP 可能无法查看此间接方式以确定首先要评估的内容。
回复:名称引用一个奇怪的列名这导致我出现列公式错误
回复:名称引用一个奇怪的列名(没有尝试,所以可能是错误的)
Formula( column(expr(colListY[1])) - :height ),
我想你想要列内的 expr 。 这样,列函数将在稍后使用之前捕获的字符串进行评估。
回复:名称引用一个奇怪的列名@XanGregg列公式不能这样工作,特殊的引用方法确实有效:
colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
eval(eval expr(dt << New Column( "test",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 2 ),
Formula( expr(column(colListY[1])) - :height ),
Set Display Width( 78 )
)));它生成一个函数列,其中公式为:
Column( "Plating Thickness (m\!"\!")" ) - /*###*/:height/*###*/
不评估。
这样做:
WrapColumns = Function({ColName},{default local},
ReturnList = {};
If(is list(ColName),
For(i=1, i<=n items(ColName), i++,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName[i] ) ) || "n"))
);
,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName ) ) || "n"))
);
Return(ReturnList);
);
eval(eval expr(dt << New Column( "test2",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 2 ),
Formula( expr(WrapColumns(colListY)[1]) - :height ),
Set Display Width( 78 )
)));你知道用 column() 系统解决这个问题的方法吗?
回复:名称引用一个奇怪的列名在仔细测试并回顾我的一些脚本后,我无法让它再次失败。 感谢您的检查!
回复:名称引用一个奇怪的列名这是一个很好的问题!
回复:名称引用一个奇怪的列名这是一个很好的问题!
回复:名称引用一个奇怪的列名@XanGregg现在我正在使用您的代码对其进行测试,它也可以在这里工作。 让我调查一下,看看我是否可以更完整地分享失败的例子......
回复:名称引用一个奇怪的列名只是为了咯咯笑,我把代码带回了 JMP 11.2.1,它工作得很好。
回复:名称引用一个奇怪的列名您能否详细说明“不起作用”部分? 我尝试了回到 JMP 15 的版本,以下似乎有效。 也许我错过了问题的一部分。
Data Table( "Big Class" ):weight << Set Name( "weight\!"\!"" );
Fit Model(
Y( Column( "weight\!"\!"" ) ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Run()
);
回复:名称引用一个奇怪的列名解释一下: print 函数做了两件事:它转义了内部引号(和其他特殊情况),它添加了外部引号。 这会产生一个有效的字符串,然后 Paul 的代码在前面添加一个 : 并在后面添加一个 n 并将结果解析为 JSL列名常量. 可能有,也可能没有一个实际的列,列名常量在脚本中使用时可以附加到。 当 Paul 的代码运行时,该列不需要存在。 如果没有 print() 函数,我不确定我会使用什么函数来完成转义(规则太复杂,无法编写我自己的。)因为原始名称包含嵌入的引号,所以在被转义之前需要转义变成了一个列名常量.
如果数据表是打开的,您可以以几乎相同的方式使用 column() 函数来获取列对象那(我很确定)可以在所有相同的地方使用列名常量可以出现。 那列对象指的是一个真正的列,至少在表关闭之前。 启动一个过期的平台列对象或一个列名常量与表列不匹配的将产生预期的错误消息。
@XanGregg
回复:名称引用一个奇怪的列名更新了 Craige 的反馈,感谢 1/i!
WrapColumns = Function({ColName},{default local},
ReturnList = {};
If(is list(ColName),
For(i=1, i<=n items(ColName), i++,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName[i] ) ) || "n"))
);
,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName ) ) || "n"))
);
Return(ReturnList);
);回复:名称引用一个奇怪的列名它是太复杂。 您可能可以将 regex() 替换为 trim(),因为这就是它所做的一切。 本来我以为是要去掉 print() 留下的外引号。 (编辑:根本不需要修剪来解析输入!)
在您的示例中,您可能有 [1] 需要 [i] 的地方。
回复:名称引用一个奇怪的列名谢谢克雷格,这似乎比它应该的更复杂,但它有效:)
对于任何尝试这样做的人,我将 Craige 的解决方案放在一个函数中:
WrapColumns = Function({ColName},{default local},
ReturnList = {};
If(is list(ColName),
For(i=1, i<=n items(ColName), i++,
insert into(ReturnList, parse(":" || Regex( Log Capture( Print( ColName[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n");)
);
,
insert into(ReturnList, parse(":" || Regex( Log Capture( Print( ColName ) ), "^\s*(.*)\s*$", "\1" ) || "n");)
);
Return(ReturnList);
);回复:名称引用一个奇怪的列名更多注释:
我在列函数中明确引用了该表。 如果打开多个表,可能会有所不同。
如果您要连接字符串,则可以这样做;即使不需要(例如高度),您也可以始终使用 :"height"n。
colreftxt = ":" || Regex( Log Capture( Print( colListY[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n";
write(colreftxt);
:"电镀厚度(m\!"\!")"n
</CODE>这可能是正确的。 表达式操作可能比解析像这样组装的文本更容易。</P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-415759" slang="en-US">回复:名称引用一个奇怪的列名</LINGO-SUB><LINGO-BODY id="lingo-body-415759" slang="en-US"><P>试试这两个答案的组合:</P><PRE><CODE class=" language-jsl">colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
script = Expr(
Fit Model(
Y( F1 ),
Effects( :height ),
Personality( "Standard Least Squares" ),
Run( F1 << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ), Plot Effect Leverage( 1 )} )
)
);
Substitute Into( script, Expr( F1 ), Column( dt, colListY[1] ) );
Write( Name Expr( script ) );
/*
Fit Model(
Y( Column( "Plating Thickness (m\!"\!")" ) ),
Effects( :height ),
Personality( "Standard Least Squares" ),
Run(
Column( "Plating Thickness (m\!"\!")" ) << {Plot Actual by Predicted( 1 ),
Plot Residual by Predicted( 1 ), Plot Effect Leverage( 1 )}
)
)
*/
Eval( script );
run with column substituted用列替换运行
回复:名称引用一个奇怪的列名@txnelson问题是在构建拟合模型脚本时不能使用 column() 格式:
Fit Model(
//Y( :"Plating Thickness (m\!"\!")"n ), <- works
Y(column("Plating Thickness (m\!"\!"")), //<- does not work
Effects(
:"Shift-temp"n, :Position, :Subgroup, :"Shift-temp"n * :Position,
:"Shift-temp"n * :Subgroup, :Position * :Subgroup
),
Personality( "Standard Least Squares" )
);@Craige_Hales用户使用 Col list box() 选择列,我将 << get items 消息传递给它。 这给了我作为字符串的列名列表。 我可以在表中找到这些列名并找到列号,但是在组装效果表达式时,此方法不允许我构建如上所示的交互。
有没有办法通过名称转义从字符串到 col 引用进行表达式连接?
回复:名称引用一个奇怪的列名如果您可以避免将列的名称作为字符串获取,而是获取列对象,则可能会更容易。 下面,cols 是列对象的列表,而不是它们的名称。
colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
cols = dt << getcolumnnames;// don't use the string keyword
/* {name, "Plating Thickness (m\!"\!")"n, sex, height, weight} */
script = Expr(
Fit Model(
Y( :weight ),
Effects( F1 ),
Personality( "Standard Least Squares" ),
Run(
:weight << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
Plot Effect Leverage( 1 )}
)
)
);
Substitute Into( script, Expr( F1 ), cols[2] );
Write( Name Expr( script ) );
/*
Fit Model(
Y( :weight ),
Effects( "Plating Thickness (m\!"\!")"n ),
Personality( "Standard Least Squares" ),
Run(
:weight << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
Plot Effect Leverage( 1 )}
)
);
*/回复:名称引用一个奇怪的列名您可以使用 Column 或 As Column 函数为复杂的列名称提供保护
colListY = {"Plating Thickness (m\!"\!")"};
newcolumnref = eval insert("column(\!"^colListY[1]^\!")");