名前は奇妙な列名を引用します列名を適合モデル式に挿入しようとしています。 そのためには、:"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);
これを行う確実な方法を知っている人はいますか?
データの探索と視覚化Re: 名前が奇妙な列名を引用している@Mark_Bailey
ああ、とても簡単ですね!素晴らしい!!!
から聞いてびっくりしました@ポールディーン:
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 workOK、このような場合、列を取得せずに列を取得する最も簡単な解決策は何でしょうか?桁() ...
(コードを実行して) それが実際に機能することを確認して驚きました。
そして古いスニプレットに戻りましたが、うまくいきませんでした。
うわー!
両方のコード行を互いの下に正確に配置すると、パズルは解決します。

-> 幸いなことに、モデルの適合には Column() 以外の複雑なコーディングは必要ありません。
Re: 名前が奇妙な列名を引用している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
);
Re: 名前が奇妙な列名を引用している
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
Re: 名前が奇妙な列名を引用している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 はこの間接性を調べて、何を最初に評価するかを判断できない可能性があります。
Re: 名前が奇妙な列名を引用しているその結果、列の式エラーが発生します
Re: 名前が奇妙な列名を引用している(試していないので間違っているかもしれません)
Formula( column(expr(colListY[1])) - :height ),
列内に expr が必要だと思います。 そうすることで、前に取得した文字列を使用して、後で列関数が評価されます。
Re: 名前が奇妙な列名を引用している@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()システムで修正する方法をご存知ですか?
Re: 名前が奇妙な列名を引用している慎重にテストし、いくつかのスクリプトを見直した結果、再び失敗することはありませんでした。 チェックしていただきありがとうございます!
Re: 名前が奇妙な列名を引用しているこれは素晴らしい質問です。
Re: 名前が奇妙な列名を引用しているこれは素晴らしい質問です。
Re: 名前が奇妙な列名を引用している@XanGregg今、あなたのコードでテストしているので、ここでも同様に機能します。 調査して、失敗例をより完全に共有できるかどうか確認させてください...
Re: 名前が奇妙な列名を引用しているちょっと笑いを誘うために、コードを JMP 11.2.1 に戻してみましたが、うまく機能しました。
Re: 名前が奇妙な列名を引用している「機能しない」部分について詳しく説明してもらえますか? JMP 15 までのバージョンを試してみましたが、以下は機能するようです。 もしかしたら問題の一部が抜け落ちているかもしれません。
Data Table( "Big Class" ):weight << Set Name( "weight\!"\!"" );
Fit Model(
Y( Column( "weight\!"\!"" ) ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Run()
);
Re: 名前が奇妙な列名を引用している見ている人のために説明すると、print 関数は 2 つのことを行います。内部引用符 (およびその他の特殊な場合) をエスケープし、外部引用符を追加します。 これにより有効な文字列が生成され、Paul のコードは前に : を追加し、その後に n を追加して、結果を JSL に解析します。列名定数。 実際の列が存在する場合もあれば、存在しない場合もあります。列名定数スクリプトで使用するときにアタッチできます。 Paul のコードの実行時には、この列が存在する必要はありません。 print() 関数がないと、エスケープを実行するためにどの関数を使用すればよいかわかりません (ルールが複雑すぎて独自に作成できません)。元の名前には引用符が埋め込まれているため、エスケープする前にエスケープする必要があります。に変わった列名定数。
データテーブルが開いている場合は、ほぼ同じ方法で column() 関数を使用して、列オブジェクトそれは (私はかなり確信しています) と同じ場所で使用できます。列名定数現れることがあります。 それか列オブジェクト少なくともテーブルが閉じられるまでは、実際の列を参照します。 有効期限が切れたプラットフォームの起動列オブジェクトまたは列名定数テーブルの列と一致しない場合は、予期されるエラー メッセージが生成されます。
@XanGregg
Re: 名前が奇妙な列名を引用している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);
);Re: 名前が奇妙な列名を引用しているそれは複雑すぎる。 実行しているのはそれだけなので、regex() をtrim() に置き換えることもできるでしょう。 当初、私は print() が残した外側の引用符を削除するつもりだと考えていました。 (編集: 入力を解析するためにトリミングする必要はまったくありません!)
例では [i] が必要な場所に [1] がある可能性があります。
Re: 名前が奇妙な列名を引用しているありがとうクレイジ、これは必要以上に複雑なようですが、うまくいきます:)
これをやろうとしている人のために、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);
);Re: 名前が奇妙な列名を引用しているその他のメモ:
列関数でテーブルを明示的に参照しました。 複数のテーブルが開いている場合は、違いが生じる可能性があります。
文字列を連結している場合は、これで済む可能性があります。必要でない場合でも、いつでも :"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">Re: 名前が奇妙な列名を引用している</LINGO-SUB><LINGO-BODY id="lingo-body-415759" slang="en-US" mode="NONE"><P>2 つの答えを組み合わせて試してみてください。</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列を置換して実行する
Re: 名前が奇妙な列名を引用している@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 メッセージを渡します。 これにより、列名のリストが文字列として得られます。 テーブル内でこれらの列名を見つけて列番号を見つけることはできましたが、エフェクト式を組み立てるときに、この方法では上記のようなインタラクションを構築することはできません。
名前エスケープを使用して文字列から列参照に移動する式の連結を行う方法はありますか?
Re: 名前が奇妙な列名を引用している列の名前を文字列として取得することを避け、代わりに列オブジェクトを取得できれば、より簡単になる可能性があります。 以下の 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 )}
)
);
*/Re: 名前が奇妙な列名を引用しているColumn 関数または As Column 関数を使用して、複雑な列名を保護できます。
colListY = {"Plating Thickness (m\!"\!")"};
newcolumnref = eval insert("column(\!"^colListY[1]^\!")");