名前は奇妙な列名を引用しますフィットモデル式に列名を挿入しようとしています。 そのためには、列名の奇妙な文字をエスケープして、:"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:名前は奇妙な列名を引用しています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:名前は奇妙な列名を引用しています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(":" || 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を使用できます(たとえば、height)。
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">Re:名前は奇妙な列名を引用しています</LINGO-SUB><LINGO-BODY id="lingo-body-415759" slang="en-US"><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 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リストbox()で列を選択し、<
名前エスケープを使用して文字列から列参照に移動する式の連結を行う方法はありますか?
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:名前は奇妙な列名を引用しています列または列としての関数を使用して、複雑な列名を保護できます。
colListY = {"Plating Thickness (m\!"\!")"};
newcolumnref = eval insert("column(\!"^colListY[1]^\!")");