名稱引用一個奇怪的列名我正在嘗試將列名插入到擬合模型表達式中。 為此,我需要轉義列名中的奇怪字符,我們使用 :"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]^\!")");