スクリプト内の数式の入力として列の値を使用するにはどうすればよいですか?全て、
私の質問は非常に基本的なものだと思いますが、まだ答えが見つかりません。
以下に示すようなデータテーブルがあります

私はしたいです
a) %CFB 列 3 というラベルの付いた 3 つの新しい列を含めます。 %CFB列4および%CFB列5。 %CFB は、ベースラインからの変化率 (%) を表します。
b) 新しい各列に、次の式から導出された値を使用して、ベースラインからの変化率を入力したいと思います。
%CFB = (x - 列 3)/列 3。ここで、「x」は、以下にコード化された各反復で列 3、4、または 5 の値に置き換えられます。列 3 はベースライン値です
dt = Current Data Table();
startcol = 3;
endcol = 5;
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
New column ("%CFB " || data_col) << Formula((( :data_col - :column 3) / :column 3) * 100 ));
上記のスクリプトを使用して新しい列を作成できましたが、数式の結果はそこに配置されません。手動で交換する場合列 3のためにデータ列数式では、予想どおり、すべての新しい列がゼロとして評価されます。これは、式が少なくとも正しく、data_col 変数が期待どおりに解釈/置換されていないことを示しています。これを機能させるための洞察をいただければ幸いです。
よろしくお願いいたします
フロイド・フォックス
Re: スクリプト内の数式の入力として列の値を使用するにはどうすればよいですか?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />どの程度の意見が歓迎されるかわかりませんが、ここにあります。
個人的には、Eval(Parse()) には大反対です。エディター内の可読性が大幅に低下するからです。私が見た 5000 行のスクリプトは、ほとんどが完全にピンク (または文字列に選択した任意の色) でした。式を置換する機能を使用すると、構文の強調表示をそのまま維持できるので、他の人のスクリプトの編集がはるかに簡単になると思います。
私は今でもごくたまに eval(parse()) を使用しますが、必要な場合には JSL quote() を使用するようにしています。
Re: スクリプト内の数式の入力として列の値を使用するにはどうすればよいですか?そこでのスコープ設定の扱いに関する優れたメモWKすべてをまとめて、フロイドフォックスいくつかのコードフォーマットを使用します。
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
new_col_name = "%CFB " || data_col;
Eval(
Eval Expr(
dt << New Column( Expr(new_col_name),
Numeric,
Continuous,
Formula( ((Column( dt, Expr( data_col ) )[] - :column 3) / :column 3) * 100 )
)
)
);
);
変数のスコープに対する別の回避策は、Formula(equation) の代わりに Set Each Value(equation) を利用することです。これには、式が計算されないため、使用するリソースが少なくなるという利点がありますが、式を変更する際に損失が生じるという欠点があります。
優れたものと同様に、適切なツールを使用して問題に対処する方法はたくさんあります。あなたが述べたように、物事がより高度になり始めた場合、 Substitute() も優れたオプションです。Substitute は、文字列を JSL コードに変換する Parse() および JSL を実行できるようにする Eval() と組み合わせると特に便利です。これにより、Eval(Parse(Substitute())) ステートメントが作成されます。この最後のテクニックは、組み込みの JMP プラットフォームに機能をラップする場合に特に役立ちます。parse() と eval(parse) の組み合わせをさらに詳しく説明するために、簡単な例を示しました。

コーディングを楽しんでください!
Re: スクリプト内の数式の入力として列の値を使用するにはどうすればよいですか?こんにちは、
この例では、変数 data_col が引き続き数式に表示されます。For ループ内で data_col を割り当てているため、ループの終了後に数式を評価しようとすると、3 つの新しい列すべてに同じ値が生成されます。これは、data_col が For ループの最後の値「列 5」を表すためです。さらに、テーブルを保存してから JMP を閉じたとします。JMP の新しいインスタンスでテーブルを再度開き、式を評価しようとすると、JMP は data_col が何を表すべきかを認識できないため、エラーが表示されます。
式で変数を使用する場合、式を評価する前に変数をその値に置き換えるよう JMP に指示する必要があります。Substitute() を使用することもできますが、Eval Expr() メソッド (ヴィンス・フォールラー0前述したように)、ほとんどの人にとって実装が簡単です。Eval Expr() は、引数として指定した式内の Expr() 関数でラップされている変数を評価 (置換) するように JMP に指示します。 外側の Eval() により、JMP は置換が行われた後に New Column ステートメント全体を評価します。JMP 使用上の注意41824もこの概念を示しています。
これがお役に立てば幸いです。
ウェンディ
Re: スクリプト内の数式の入力として列の値を使用するにはどうすればよいですか?ヴィンス、
これありがとう。率直に言って、あなたが提供した式についてはもう少し読む必要がありますが、私のコードが機能しなかった理由についての洞察に感謝します。
よろしく
フロイド
Re: スクリプト内の数式の入力として列の値を使用するにはどうすればよいですか?ネイト
おかげで、このコードは機能し、コードの背後にあるロジックを理解できるという利点もあります。
フロイド
Re: スクリプト内の数式の入力として列の値を使用するにはどうすればよいですか?ヴィンス・フォールラー0確かに問題の根本を正確に特定しました。データテーブルには data_col という名前の列がありません。したがって、書かれたコードは存在しないものを参照していることになります。また、Vince は、JSL を使用して動的参照を保持するコードを記述する強力な方法をいくつか示しています。とはいえ、優れた言語ではロジックを実行するための複数のオプションがあります。
列を参照する別の形式を使用することをお勧めします。単純な形式はセミコロンと列名を使用して現在のデータ テーブル列を参照することですが、より強力な方法は列 (データ テーブル参照、列文字列または数値) 形式を使用することです。以下では、その形式を使用するためにコードを少し変更しました。
dt = Current Data Table();
startcol = 3;
endcol = 5;
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
col_name = "%CFB " || data_col;
dt << New Column(col_name,
Numeric,
Continuous,
Formula( ((column(dt, data_col)[] - :column 3) / :column 3) * 100 ) );
);
Re: スクリプト内の数式の入力として列の値を使用するにはどうすればよいですか?:variable は実行できません (特に文字列の場合は、<
に変更すると、
data_col = Column( i ) ;
Eval(EvalExpr(New column ("%CFB " || Expr(data_col<<GET name=""></GET>
それは機能するはずです。
EvalExpr() 内のすべての Expr() を変数ではなく実際の値に置き換えるだけです。