事後に実行しない限り実行されないスクリプトの部分テーブル内の列を再コーディングして値を「X」から 0 に変更するために使用しているスクリプトの一部があります。 コードのこの部分は、メイン スクリプトとは別に実行した場合に動作するようになりました (JMP ディスカッション フォーラムに感謝します!!)。 ただし、これをより大きなスクリプトに挿入すると (最後であっても)、JMP はコマンドを実行しません。 コードをスクリプトの途中に配置すると、それ以降のすべてが実行されませんでした。そのため、コードをメイン スクリプトの最後に移動しましたが、それでも実行されません。 この部分を強調表示して事後実行するたびに、私が望んでいることが正確に行われます。
wait(0); を実装し、i から k に変更し、For Each Row の周囲で Try ステートメントも使用してみましたが、うまくいきませんでした。 なぜ事後的にしか機能しないのか、私は本当に頭を悩ませています。 提案はありますか?
//Recode columns in Yield Table to give "0" instead of X's
wait(0);
yieldcols = Yields << get column names;
For Each Row( For( k = 1, k <= N Items( yieldcols ), k++,
If( Is Missing( As Column( yieldcols[k] )[] ),
As Column( yieldcols[k] )[] = 0 ) ) );
高度な統計モデリング自動化とスクリプト作成データのブレンディングとクリーンアップ実験計画法マスカスタマイゼーションRe: 事後に実行しないとスクリプトの一部が実行されないこんにちは、
私が提供したコードがなぜ機能しないのかわかりません。 次のことを試してみるとよいでしょう。
1) 提供した元のコードを単独で新しいウィンドウで実行します。 効果ありますか? そうでない場合、どのバージョンの JMP を使用していますか? たとえば、データ テーブルの直接インデックス作成は数バージョン前に追加されましたが、JMP 12 には含まれていません。
2) 上記 1) が機能すると仮定すると、次のステップは、「dt」のすべてのインスタンスを「yields」に置き換え、新しいウィンドウで新しいコードを単独で実行することです。 これは私にとってはうまくいきましたが、1) がうまくいった場合は、あなたにもうまくいくと思います。
Names Default To Here(1);
//create a table with roughly 10% missingness
yields = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( yields ), i++,
yields[Loc( Is Missing( yields[0, i] ) ), i] = 0
);
3) テーブル内のデータが数式ベースの場合、数式は列に「書き込まれている」可能性がありますが、欠落部分を修正する予定の JSL が実行を開始するまでに評価が完了していない可能性があります。 コードを実行する前に、コードの前に次の行を追加して、すべての数式が完全に更新されていることを確認してください。
Yields << run formulas;
4) 「Yields」が対象のデータ テーブル以外のものを参照していないことを確認します。列名、別の変数名、テーブル変数などではありません。 このため、ベスト プラクティスとして、テーブルを指すために使用される変数名のどこかに「dt」を使用することをお勧めします。値の行列またはベクトルに誤って「Yields」という名前を付けることで、テーブル ハンドル「Yields」を上書きすることは容易に想像できますが、そのような行列またはベクトルに誤って「YieldDt」という名前を付ける可能性ははるかに低くなります。 ただし、プログラムは実行を一時停止しても機能するため、これが問題だとは思いません。
1) と 2) がうまくいき、3) も 4) も問題を解決できない場合は、さらに詳しい情報が必要になります。サンプル、サニタイズされたテーブル、およびそのテーブルに対して実行して、そのテーブルでは置換が機能していません。
乾杯、
ブレイディ
Re: 事後に実行しないとスクリプトの一部が実行されないハイマーク。 これは現在個別に実行されていますが、大きなスクリプトの小さな部分としては機能しません。 これはスクリプトの問題ではなく、別の問題なのではないかと考えています。 コードのセクションが単独で実行されると機能するのに、より大きなスクリプトの一部として実行されると失敗するのはなぜですか (最初のシナリオのように最後に実行した場合でも)。Re: 事後に実行しないとスクリプトの一部が実行されないこんにちは、ブレイディさん
すべてのアドバイスと助けに感謝します。 ただし、提供されたコードのこのセクションは(テーブル名を変更した後)機能していないようです。 これは非常に奇妙だと思います。それが機能しない理由がわかりません。 何か案は?
For( i = 1, i <= N Col( Yields ), i++,
Yields[Loc( Is Missing( Yields[0, i] ) ), i] = 0
);
私の質問を少し言い換えると、次のようになります。現在私が持っているコードは、個別に実行すると機能しますが、大きなコードの小さなセクションとして実行すると機能しません。 それ自体が奇妙だと思います。 コードを変更することに問題はありません。私にとっては、それが問題ではないと思われるだけです。(「完璧」ではありませんが) 実際に機能するからです。 これはバグでしょうか? それとも、この問題をトラブルシューティングする方法はありますか? デバッグ時にもエラーは出ませんでした。
Re: 事後に実行しないとスクリプトの一部が実行されないまた、複数の行または列がある場合は、nrows (dt) または ncols (dt) を変数にバインドし、それを上位インデックスとして使用します。これにより、nrow(dt) または ncol(dt) を反復ごとに評価する必要がなくなります。
//do some stuff
);nc = ncol (dt);
for (i = 1, i<=nc, i++,
JMP 16 では、これを for each( ) ループで実行できます。for each row( ) と混同しないでください。 For Each( ) には、変数のローカル スコープ設定や場合によっては実行の高速化など、基本的な for( ) ループに比べていくつかの利点があります。 JMP 16 を使用している場合は、必ずチェックしてください。
for each ( { i }, 1::nrow( dt ),
//do some stuff
);
Re: 事後に実行しないとスクリプトの一部が実行されないまた、最初に認めておきたいのは、私は For Each Row() を一度も使用したことがないということです。
これまで。
たとえ子供たちが無料で食べてもそうではありません。
行をループする必要がある場合 (この例のように直接インデックスを作成するか、<< get 値を使用して結果のリストまたは行列を操作するなどして、列の値を一度に取得することで回避しようとしています)。 、 適切な for ( ) ループを書きます。
For Each Row () が決して機能しないと言っているわけではありません。 注意事項があると言っているのですが、その注意事項が何なのかはわかりません。 したがって、私は For Each Row () を疫病のように避け、他の人にも同じようにすることをお勧めします。ただし、1) 注意事項を学ぶ意欲があり、2) コードを編集、保守、またはその他の方法で操作する人が次のことを想定している場合を除きます。未来も同じようになります。
後者はありそうもないので、前者を引き受けようと思ったことは一度もありません。
乾杯、
ブレイディ
for (i =1, i<=nrow(dt), i++,
//do some stuff
);
Re: 事後に実行しないとスクリプトの一部が実行されないこんにちは、
大きなテーブルでのパフォーマンスが懸念される場合は、次のことを試してみるとよいでしょう (テーブル名として dt を使用したことに注意してください)。 中程度のテーブル (100,000 行 x 5 列) では、私のマシンではパフォーマンスの違いが顕著で、0.0056 秒と 0.8261 秒でした。 これには次のような理由があります。
まず、Loc ( ) 関数と Is Missing ( ) 関数は、列全体で一度に使用した場合でも高速です。これがここで実行していることです。 つまり、dt[0, i] は列 i の全体を取得します。
さらに、列に直接インデックスを付けることで、列の名前を取得したり、列を含むリストから列を取得したりする必要がなくなります。
乾杯、
ブレイディ
Names Default To Here(1);
//create a table with roughly 10% missingness
dt = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( dt ), i++,
dt[Loc( Is Missing( dt[0, i] ) ), i] = 0
);
Re: 事後に実行しないとスクリプトの一部が実行されない//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[col] )[] ), As Column( yieldcols[col] )[] = 0 ) )
);
Re: 事後に実行しないとスクリプトの一部が実行されない試してみました。 これは、個別に実行した場合でも機能しません。 私が持っている元のスクリプトは機能しますが、個別に実行した場合に限られます(事後、スクリプト全体が実行され、そのセクションで Ctrl+R を押した後)。Re: 事後に実行しないとスクリプトの一部が実行されない//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[k] )[] ), As Column( yieldcols[k] )[] = 0 ) )
);