JSLはバージョン19では失敗するが、バージョン17では動作する。JMP 17 から JMP 19 にアップグレードしました。JMP 17 では問題なく動作する長くて複雑なルーチンがあるのですが、19 で実行すると失敗します。他にも失敗があるかもしれませんが、最初に遭遇したのは、インポートしたデータの既知のエラーを修正するために変更する行を選択する際に発生する問題です。デバッグ中に、「Get Rows Where」コマンドが空のマトリックスを返していることがわかります。対象の行がデータ テーブルに存在することは確認済みで、メニュー ウィンドウに条件を入力することでプログラムに強制的に選択させることができます。
row_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
後続のコマンドは、row_to_update が [](0, 1) を返すため、その行に対して目的の修正を行うことができません。
newContribは以前にデータテーブルとして定義されています。変数名にカーソルを合わせると、ポップアップに正しいテーブルが表示されます。
ドキュメントに基づいて、Where を使用するように行を変更してみましたが、同じように失敗しました。
row_to_update = newContrib[Where(:"request_id" == 263496 & :"line_no" == 0)];
リリースノートには何も記載されていませんでした。ヘルプマニュアルによると、構文は正しいようです。
何が変わってこの機能が使えなくなったのか、そしてどうすれば直せるのか、どなたか説明していただけませんか?
大変感謝いたします!
ナンシー
自動化とスクリプト作成Re: JSLがバージョン19では失敗するが、バージョン17では動作する<< Get Rows Where は JMP 19 でもそのように動作します。2 番目のコマンド (Where() を使用) は少し変更する必要があります。
Names Default To Here( 1 );
dt= Open( "$SAMPLE_DATA/Big Class.jmp" );
row_to_update = dt<< Get Rows Where( :"name" == "JANE" & :"age" == 12 ); //[3]
row_to_update2 = Where( dt, :name == "JANE" & :age == 12 ); //[3]
row_to_update = Where( newContrib, :request_id == 263496 & :line_no == 0 );
問題の原因は何でしょうか?まず、データ型が正しいかどうかを確認してください。JMP 19 ではこれらの列が文字型として取り込まれ、JMP 17 では数値型として取り込まれていた、といったことはありませんか?「<< Get Rows Where」の構文は変更されていないので、おそらくこのような単純な問題でしょう。
Re: JSLがバージョン19では失敗するが、バージョン17では動作するこんにちは、ナンシーさん。
[](0,1)は、row_to_updateが空のリストであることを意味し、データテーブルに一致する行がないことを示しています。Get Rows Where()はリストを返すため、以下のスクリプトに示す別の方法の方が適しているかもしれません。
names default to here (1);
newContrib = New Table( "newContrib",
Add Rows( 3 ),
New Column( "request_id",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [263496, 263496, 263496] )
),
New Column( "line_no",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0, 0, 1] )
)
);
row_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
//row_to_update is [1,2]
row_to_update = newContrib << Get Rows Where(:"request_id" == 263497 & :"line_no" == 0);
//row_to_update is empty: [](0, 1)
row_to_update = (newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0))[1];
//row_to_update is 1
//a different approach:
rows_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
if (n items(rows_to_update) > 0, row_to_update = rows_to_update[1]);
Re: JSLがバージョン19では失敗するが、バージョン17では動作するWhere句の正しい構文についての説明、Get Rows Whereの構文が変更されていないことの確認、そして何よりもデータ型を確認するように提案していただき、ありがとうございました!まさにそれが問題でした(整数が文字として取り込まれていたのです)。実際、以前は自動的に様々な型として認識されていた十数枚のシート上のすべてのデータが、今では文字としてインポートされています。インポート動作の根本的な変更だったので、確認しようとも思いつきませんでした。基本に立ち返ることを忘れていたことを思い出させていただき、本当に感謝しています!それに、列のデータ型を変更する行を追加したり、openコマンドの設定を見直したりする方が、「Get Rows Where」を使用している数百行のコードの構文を変更するよりもはるかに簡単に修正できます!
どうもありがとうございました。
ナンシー
Re: JSLがバージョン19では失敗するが、バージョン17では動作するうまくいってよかったです。付け加えるとしたら、スクリプトを更新して Where() を使うようにすると良いかもしれません。パフォーマンスが大幅に向上します。例えば、100万行のテーブルでこのコードを実行したところ、Where() は < よりも桁違いに高速でした。
Names Default to Here( 1 );
dt = Current Data Table();
now = HP Time();
row_to_update = dt << Get Rows Where( :request_id == 220681 & :line_no == 70 );
then = HP Time();
elapsed = then - now;
Show( elapsed ); //119053
Wait( 2 );
now = HP Time();
row_to_update = Where( dt, :request_id == 220681 & :line_no == 70 );
then = HP Time();
elapsed = then - now;
Show( elapsed ); //11777