JSL:DT << SelectWhere Behavior通常の「SelectWhere」の使用法は次のようになります。
dt<<SelectWhere(:ExampleColumnName > 5);
そして、これはうまくいきます。 私が苦労しているのは、「:ExampleColumnName」がどうなるかについてもっと柔軟性が必要なときです。
たとえば、スチューデント化残差の新しい列をFitモデルに保存すると、「条件別のスチューデント化残差ログ(CFU / mL)」のような列が作成されます。 3より上または-3より下のいずれかを選択するとします。 列の名前のため、次を使用する必要があります。
dt<<SelectWhere(:Name("Studentized Resid Log(CFU/mL) By Condition")<-3 | :Name("Studentized Resid Log(CFU/mL) By Condition")>3);これはほとんどの場合問題ありませんが、常にそうとは限りません。 :Name()内に完全に書き出された文字列を含めることは、実際には理想的ではありません。たとえば、それぞれが異なるスチューデント化残差列名を生成するさまざまなFitモデルで関数を使用できるようにする計画の場合、それは理想的ではありません。考えられるすべてのモデルに対して一意の「SelectWhere」を作成するのは効率的ではありません(特に、ユーザーが選択するモデルを常に予測できるとは限らない場合)。
私が働きたいのは、次のいずれか/両方です。
//Option 1
colName = ""Studentized Resid Log(CFU/mL) By Condition";
dt<<SelectWhere(:Name(colName)<-3 | ::Name(colName)>3);
//Option 2
colRef = Column(dt, colName);
dt<<SelectWhere( colRef <-3 | colRef >3 );
オプション1は、SelectWhere関数を実行すると、「Name引数は引用符で囲まれた文字列でなければなりません」というエラーを返します。 :Name()には完全に書き出された文字列が必要であり、その文字列への参照は受け入れられないようです。
オプション2はエラーを返しませんが、何も選択されません。 SelectWhereは、明示的に入力された「:XXXX」参照のように列参照変数を処理しないようです。
私の現在の回避策は素晴らしいものではありません。FitModelが新しい列を作成した後、テーブルの最後の列の名前を、SelectWhereの「通常の使用法」で直接使用できるシンプルでユニークなもの(「StdResid」など)に変更します。 :StdResid ")。
私の人生を楽にする何か明白なものがここにありませんか?
また、オプション1および/またはオプション2を機能させる方法はありますか?
Re:JSL:DT << SelectWhere Behavior私はほとんどの場合、As列を使用します。 文字列名または列参照のいずれかで機能します。
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// column name
col = "height";
dt << Select Where( AsColumn(col) <60 );
Wait(2);
dt << Clear Row States;
// column reference
col = Column(dt,"height");
dt << Select Where( AsColumn(col) > 65 );
実際のテキスト文字列をその場で:Nameに埋め込む必要があると感じた場合は、示されている他の方法を使用しますが、扱いやすい他の構文を使用します。
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colName = "height";
Eval(Parse(EvalInsert("\[
dt << Select Where( :Name("^colName^") > 65 );
]\")));Re:JSL:DT << SelectWhere Behaviorこんにちは、
理解しておくべき重要な部分は、それぞれが返すものだと思います。
- :Name()構文は、ご覧のとおり、文字列引数のみを受け入れる特別なパーサーです。 これにより、スクリプト作成に非常に柔軟性がなくなります。
- Column()関数は、列全体への参照を返します。 Select Where()は、各行で比較を実行します。 Row()添え字(または単に[])をColumn()関数に追加すると、Select Where()が比較を実行している間は、現在の行の列を調べるようにJMPに指示されます。
colName = "Studentized Resid Log(CFU/mL) By Condition";
dt << Select Where( Column( colName )[] < -3 | Column( colName )[] > 3 );
- As Column()関数は、現在の行の指定された列の値への参照を返します。 Select Where()のコンテキストでは、現在の行はSelect Where()によって制御されています。 そのため、Row()の添え字は必要ありません。 @pmrozの例。
お役に立てば幸いです。
Re:JSL:DT << SelectWhere Behavior両方の素晴らしいアイデア、ありがとう。 私は以前にColumn(dt、colName)を使おうとしていましたが、AsColumn()が存在することを知りませんでした。
オプション1とオプション2の機能がいつか実装されるのを見たいです。 これを求める最良の方法は何ですか?
Re:JSL:DT << SelectWhere BehaviorJSLと列の名前は、特にGETROWSWHEREまたはSELECTWHEREを使用しようとしている場合は混乱を招きます。 私はこの構成をcolumn(dt、 "column-name")として使用する傾向があります。
これは機能します:
dt = New Table( "Test Table", Add Rows( 9 ),
New Column( "Studentized Resid Log(CFU/mL) By Condition",
Numeric, Continuous, Format( "Best", 12 ),
Set Values( [-4, -3, -2, -1, 0, 1, 2, 3, 4] ) )
);
colName = "Studentized Resid Log(CFU/mL) By Condition";
dt << Select Where(as column(dt, colName) < -3 | as column(dt, colName) > 3);
Re:JSL:DT << SelectWhere Behaviorこれが私が使用するアプローチです。他に必要な結果が得られていないように思われる場合は、次のようにします。
Eval(parse("dt << select where(" || ":Name(\!"" || Char( Column( dt, 1 ) << get name ) ||
"\!")< -3 | :Name(\!"" || Char( Column( dt, 1 ) << get name ) || "\!") > 3);"));