名稱引用一個奇怪的列名稱我正在嘗試將列名插入到擬合模型表達式中。 為此,我需要轉義列名稱中的奇怪字符,以便我們使用 :"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);
有人知道一個可靠的方法來做到這一點嗎?
數據探索和可視化回复:名稱引用了一個奇怪的列名@馬克貝利
啊,太簡單了!偉大的!!!
我很驚訝地聽到@保羅丁:
https://community.jmp.com/t5/Discussions/Name-quote-a-strange-column-name/mp/415735/highlight/true#M66485
那
構建擬合模型腳本時,不能使用 column() 格式:</CODE><HR /></BLOCKQUOTE><P> </P><PRE><CODE class=" language-jsl">Fit Model(
//Y( :"Plating Thickness (m\!"\!")"n ), <- works
Y(column("Plating Thickness (m\!"\!"")), //<- does not work好的,如果是這樣的話,獲得列的最簡單的解決方案是什麼柱子() ...
現在我很驚訝地發現(通過運行你的代碼)它確實有效。
然後回到舊的代碼片段 - 但它不起作用。
哇!
如果將兩行代碼正好放在彼此的下面,那麼這個難題就解決了:

-> 幸運的是,擬合模型不需要花哨的非 Column() 編碼。
回复:名稱引用了一個奇怪的列名Names Default To Here( 1 );
dt = New Table( "plating",
New Column( "Plating Thickness (m\!"\!")", Set Values( [1, 2, 3, 4] ) ),
New Column( "X", Set Values( [12, 26, 33, 39] ) )
);
col = Column( dt, "Plating Thickness (m\!"\!")" );
Fit Model(
Y( col ), // <- works :)
Effects( :X ),
Personality( "Standard Least Squares" ),
Run
);
回复:名稱引用了一個奇怪的列名
dt = New Table( "plating",
Add Rows( 4 ),
New Column( "Plating Thickness (m\!"\!")",Set Values( [1, 2, 3, 4] )),
New Column( "X",Set Values( [12, 26, 33, 39] ))
);
colListY = {"Plating Thickness (m\!"\!")"};<BR /><BR /><BR />
newcolumnref = Name Expr(AsColumn(colListY[1])); // -> :"String"n<BR />
Fit Model(
//Y( :"Plating Thickness (m\!"\!")"n ), <- works
//Y(column("Plating Thickness (m\!"\!"")), //<- does not work
Y(newcolumnref), // <- works :)
Effects(:X),
Personality( "Standard Least Squares" )
);從
https://community.jmp.com/t5/Discussions/Need-help-with-expressions-column-references-formulas-and-column/mp/490220/highlight/true#M73282
回复:名稱引用了一個奇怪的列名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);
);回复:名稱引用了一個奇怪的列名它是太複雜。 您可能可以用trim()替換regex(),因為這就是它所做的一切。 最初我以為它會刪除 print() 留下的外部引號。 (編輯:並且根本不需要修剪即可解析輸入!)
在您的示例中,您可能需要 [i] 的地方有 [1]。
回复:名稱引用了一個奇怪的列名謝謝克雷格,這似乎比應有的更複雜,但它有效:)
對於任何嘗試這樣做的人,我將克雷格的解決方案放入一個函數中:
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" mode="NONE">回复:名稱引用了一個奇怪的列名</LINGO-SUB><LINGO-BODY id="lingo-body-415759" slang="en-US" mode="NONE"><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 substitutedrun with column substituted用替換的列運行
回复:名稱引用了一個奇怪的列名@tx尼爾森問題是,在構建擬合模型腳本時,無法使用 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 列錶框()選擇列,然後我將 << 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]^\!")");