堅牢な列参照JSLで数分コーディングした後、ユーザーは:セックスのような奇妙なオブジェクトについて疑問に思う。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
x = :sex
熟練したユーザーは、このような列参照をある程度経験しており、常に使用しています。
でも:sex って何ですか? dt:セックスの方が堅牢ですか? ドキュメントはどこにありますか?
洞察を集めて共有しましょう。ご意見をお寄せください。また、誤りを見つけた場合は投稿を訂正してください。
私の意見:
自動化とスクリプト件名:堅牢な列参照JSLでは、同一の列参照:セックス (またはdt:セックス )を2つの方法で使用できます。
# 1) 列への参照として
:sex << get name;
Data Table( "Big Class Families" ) << Distribution( Nominal Distribution( Column( :sex ) ));
...そして2番目
この列の現在の行のエントリを取得するには、次のようにします。
[編集]: いいえ!
「列の数式で使用され、通常は「現在の行の値」と考えることができます。」
しかし、このタイプのセックスを必要とするケースは他にもたくさんあります。
</CODE></PRE>
<BR />
<P>ご注意ください:列数式では、以下の方法は同等です。</P>
<PRE><CODE class=" language-jsl">new column("s", formula (:sex));
new column("s", formula (:sex[]));
new column("s", formula (:sex[row()]))
row()=5;
s=:sex; // value of the current row
// other cases:
lag(:sex,1); // value of the previous row
Col Mean(:height, :age)); // mean :height of rows with same :age
文字列からそのようなオブジェクトを作成するには、2つの方法があります。
column name = "sex";
col= Column (column name); // for the first one (accessing the column)
val = As Column (column name) // for the second one (accessing the column in formulas)
実は、 @jthiさんから教えてもらった、とてもクールな3つ目の選択肢があるんです。
the universal column reference = Name Expr(As Column(column name))
:セックスのように使用できます。どちらのアプローチでも、列を参照し、現在の行のエントリにアクセスします。
Column() と As Column() と datable:column と dt:As name("column")
Re: 堅牢な列参照:sex は壊れやすそうです - ユーザーが列名を変更するとどうなるでしょうか?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
x = Name Expr(As column("name"));
Show(Name Expr(x)); // : name
:name << set name("The name");
Show(Name Expr(x)); // :The name
わあ、すごい!全然壊れない!
Re: 堅牢な列参照ユーザーがデータ テーブルを変更するとどうなりますか?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
x = Name Expr(As column("name"));
Show(Name Expr(x));
x[1] = "Marker";
:name << set name("The name");
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
Show(Name Expr(x));
Show(x[1])
純粋な:sex は、それが実際にどのデータテーブルに属しているかまで知っています。素晴らしい!
Re: 堅牢な列参照さて、1 列から 2 列にしてみましょう。
myList1 = {:name,:sex,:age};
このリストを作成するための非常に複雑で役に立たない方法は次のとおりです。
myList2 = Eval List({Name Expr(As column(:name)),Name Expr(As column(:sex)),Name Expr(As column(:age))});

Re: 堅牢な列参照使い物にならない?
上記のコードを
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
最初の行は、開いているデータテーブルがないことを気にしません。2行目を実行すると、JMPは次のようなエラーメッセージを表示します。

さらに良いことに、2 番目のアプローチでリストを作成すると、列参照が非常に堅牢になります。
現在のデータ テーブルとは関係なく、JMP はdtに移動してそこから列を使用します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
myList1 = {:name,:sex,:age};
myList2 = Eval List({Name Expr(As column(:name)),Name Expr(As column(:sex)),Name Expr(As column(:age))});
dt2= Open( "$SAMPLE_DATA/Big Class Families.jmp" );
dt << Select Rows( [1] ) << Delete Rows; // now dt starts with Louise - there is no Katie anymore!
Show(Eval List(myList1), // Katie? why Katie!!!
Eval List(myList2)); // Louise -> works!

どのように機能しますか?
Show(Type(myList1[1]), Type(myList2[1]))
さらなる洞察を提供します:

単純なリスト( マイリスト1 )には「名前」が含まれています。*)
複雑なリスト( マイリスト2 )には「列」が含まれています**)
*)名前が評価されるとき、JMP は特定のルールに従ってその名前の意味を判断します。
https://www.jmp.com/support/help/en/19.0/#page/jmp/rules-for-resolving-names.shtml
役割の中で、JMP は現在のデータ テーブル( dt2 ) 内の列を検索します。
**)列の場合、JMP はデータ テーブル (" dt ") に移動して列にアクセスするだけです。
とても頑丈です!
Re: 堅牢な列参照Name Expr(As column(:col))
すごくかっこいいです!
Re: 堅牢な列参照Column() はさまざまな状況で機能し、列名の形式に関して非常に柔軟です。
Distribution(
Continuous Distribution( Column( :Random Normal )),
Continuous Distribution( Column( "Random Normal" )),
Continuous Distribution( Column( :"Random Normal"n )),
Continuous Distribution( Column( "Random Normal"n )),
Process Capability( 0 ) )
Re: 堅牢な列参照興味深いことに、列のリストを要求された場合、JSL 関数は列のリストではなく、名前のリストを返します。
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
colList = Eval List({Name Expr(As column("sex"))});
write(Name Expr(colList[1]), " is a ", // :sex
Type(Name Expr(colList[1])), "\!n"); // Column -> universal & robust
selectedCols = dt << select columns (:sex) << get selected columns;
write(Name Expr(selectedCols[1])," is a ", // : sex
Type(Name Expr(selectedCols[1])), "\!n"); // Name -> fragile
dt << Group Columns(Item Range( :sex, :height ),"myColGroup");
colsFromColumnGroup = dt << get column group("myColGroup");
Write(Name Expr(colsFromColumnGroup[1]), " is a ", // :sex
Type(Name Expr(colsFromColumnGroup[1])), "\!n"); // Name -> fragile

列名を取得する()と列参照を取得する()の違い:
ColNames = dt << get column names; // default setting: returns names, not Strings
Write(Name Expr(ColNames[3]), " is a ", // sex (more or less the same as :sex)
Type(Name Expr(ColNames[3])), "\!n"); // Name -> fragile
ColRefs = dt << get column references;
Write(Name Expr(ColRefs[3]), " is a ", // Column("sex"
Type(Name Expr(ColRefs[3])), "\!n"); // Column -> robust, but not :sex, see below

次に列を操作して、行 1 の:セックスの値を尋ねてみましょう。
//hide the column
:sex << set name("hidden");
// who finds it?
row()=1;
Try(Show(Eval(ColList[1])), print(exception_msg));
Try(Show(Eval(colsFromColumnGroup[1])), print(exception_msg));
Try(Show(Eval(selectedCols[1])), print(exception_msg));
Try(Show(Eval(ColNames[3])), print(exception_msg));
Try(Show(Eval(ColRefs[3])), print(exception_msg));

Re: 堅牢な列参照持ち帰りメッセージ:
学んだことを活かして
myList2 = Eval List({Name Expr(As column(:name)),Name Expr(As column(:sex)),Name Expr(As column(:age))});
JMPが提供するリストは、次のように堅牢な列リストに変換できます。
ColNames = dt << get column names;
colList = Transform Each({col}, ColNames, Name Expr(As Column (col)));
Re: 堅牢な列参照
バイロン・JMP wrote:
Column() はさまざまな状況で機能し、列名の形式に関して非常に柔軟です。
Distribution(
Continuous Distribution( Column( :Random Normal )),
Continuous Distribution( Column( "Random Normal" )),
Continuous Distribution( Column( :"Random Normal"n )),
Continuous Distribution( Column( "Random Normal"n )),
Process Capability( 0 ) )
Hi バイロン・JMP , one can have a lot of fun with カラム() inside 分布()
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Distribution(Continuous Distribution( Column( :height )) );
Distribution(Continuous Distribution( Column( "height")) );
列参照、名前、さらには文字列も!すべて動作します。
分布コマンドの外部で定義された列を使用しようとするまで:
col = Column("height");
Show(col); // shows: it's a column
Distribution(Continuous Distribution(col));
Distribution(Continuous Distribution(Eval(col)));
Distribution(Continuous Distribution(Name Expr(col)));
「全部試してみよう。そのうちの 1 つは機能するはずだ」というような難解な式処理のトリックをすべて試しても、どれも機能しません。
いつも同じヒントですが、それはどういう意味ですか?!?

解決策は非常に簡単ですが、間違った場所で探すと何時間もかかることがあります。
開ける前に自分で解決策を見つけてください
:mano_con_el_dedo_índice_apuntando_hacia_abajo:
もっと見る...
Column( :height ) inside
連続分布()
見た目 like
列("高さ") in
col = 列("高さ");
But it is a
名前付き引数 - like
式() in
新しい列(数式(...)).
So the "obvious" solution is: keep the name of the named argument and place the column inside:
Distribution(Continuous Distribution(Column(col)));
Re: 堅牢な列参照私のアプローチははるかにシンプルです。念頭に置いている特定の目的に合わせて、列のリストを注意深く作成します。時には、異なる形式の列のリストを複数作成することもあります。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
text = dt << Get Column Names();
quote = dt << Get Column Names( String );
colformat = dt << get column reference();
quote = dt << Get Column Names( String );
show(text, quote, colformat);
結果は次のようになります:
text = {名前、年齢、性別、身長、体重};
quote = {"名前", "年齢", "性別", "身長", "体重"};
colformat = {列("名前"), 列("年齢"), 列("性別"), 列("身長"), 列("体重")};
3つのうちの1つは、eval(parse())に頼らなければならない場合でも、通常は機能します。
Re: 堅牢な列参照基本的には賛成です。少し注意すれば、名前はそれほど危険ではありません。
列リストを作成した後に列の名前を変更し、その後古い名前が機能しなくなったことに疑問を抱いたり不満を抱いたりするのは賢明なことかどうか議論の余地があります。
2 つのテーブルを操作する場合は、正しいデータ テーブルが現在のデータ テーブル () であることを確認する必要があります。
列名も同様です:
JMP は列名を大文字やスペースがあっても正しく処理すると想定できます。[リンクを参照]
あるいは、慎重になり、いくつかのルールに従うこともできます。(名前、変数、列名の衝突を避ける、スペースに注意する、など) そうすれば、ほとんどの場合、問題なく安全に過ごせます。
Re: 堅牢な列参照こんにちはバイロン・JMP 、細かいことを言うと...

get column names() は名前のリストを返します;)
Re: 堅牢な列参照重要な発見 - 最初の投稿の 1 つを編集しました。
私の考えが、少なくとも@Craige_Halesのような一部のユーザーには理解してもらえることを願っています。
これらのユーザーも私と同じように驚き/啓発/喜びを共有し、それがこのようになっていることを確認したり、説明を提供したり、訂正したりして協力してくれるだろうと思います。
これまで、 列(col)としては現在の行の値を取得する方法だと考えていました。特に、「列アクセス」の列(col) ( Column(col) << get name など) と比較して考えていました。
逆の意味合いでは、
「現在の行の値」以外の目的で :col を使用する場合、それを変数に置き換えたいときは、 As column() を使用する必要はなく、代わりに Column(col) を使用する必要があります。
[私もその名前に戸惑ったことを認めなければなりません:
列() として- 逆を行う関数の場合、列ではなく現在の行の値を取得しますか? 冗談ですか?
もう一つの考え:
このような場合に列(col)として機能すれば、それは単にJMPがユーザーのエラーを自動的に修正するためか、あるいは名前 expr(As column(col))のように、誰もが使っているが誰も説明していない難解な効果によるものである。
だから、次のことを知って、私はとても安心しました。...]
この解釈は間違っているに違いありません。これはJMPの自動処理によって引き起こされ、次のような考え方に至っていると考えられます。
column(col) として、カラムへのアクセスを提供します。
( 評価(列() として...) )i で評価された場合、 列(col)[]または列(col)[行()]に変換され、これを使用して現在の行の値にアクセスできます。評価されずに他の関数で使用される場合は、列にアクセスできます。
なぜそう思うのでしょうか?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
row()=10;
Lag(:height); // 60
Show(lag(Column ("height"),1)); // Column("height") !!!
Show(lag(As Column ("height"),1)); // 60 !!!
Col Mean(:height); // 6255
Col Mean(:height, :age); // 60.285...
Show(Col Mean(Column ("height"))); // 62.55 (why does it work? another automatism because it is used so often?)
Try(Show(Col Mean(Column ("height"), :age)),Print(exception_msg)); // !!!
Show(Col Mean(As Column ("height"), :age)); // 60.285...
[ https://community.jmp.com/t5/Discussions/Using-numeric-objects-in-a-column-equation/mp/903939/highlight/true#M106270によってトリガーされました ]
Re: 堅牢な列参照この学びに基づいて、私は具体的な質問を持っています。
包括的な概要はありますか?
- which functions act in the spirit of
Eval(:col), Where(:col=1) and Type(:col) ?
i.e. taking the column :col and それを解釈すると:col[行()] ?
もっと見る...
rw = Row();
Where( :age == Column( "age" )[rw] );
- また、どの関数が「 [行]を無料で追加」せずに、単に列を列として扱うのでしょうか?
列中央値(:列), 遅延(:列,1)など
どのグループに最も多くのメンバーがいますか?
Re: 堅牢な列参照Col Mean は脚本ではうまく機能しないと思います。
ただし、データ テーブルの数式列に列数式 Col Mean(:height,:age) が適用された場合、行 10 の値は "60.285714286" になります。
また、「62.55」は、Col Mean(;height) を含む数式列にある場合の行 10 の値です。
これは、特にテーブルがプライベートである場合に、別のテーブルの値の検索を隠すための非常に優れた方法です。
Re: 堅牢な列参照申し訳ありませんが、要点がよく分かりません。
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" , Private);
col median(dt:height);
vals= dt:height << get values();
vals=dt[0,"height"];
Median(vals);