expr() を使用して数式内の変数列名を置き換えます入れ子になったループを作成してみます。
最初のループではいくつかの列を作成し、それに数式を含めます
2 番目のループで他の列を作成すると、数式には 1 番目のループの列が必要になります。
私の質問は2番目のループにあります。 eval() + substitue() + expr() を使用して数式の列名を正しく設定できません
Names Default To Here( 1 );
dt = current data table();
a=3;
b=3;
alist = {1,2,3};
blist = {1,2,3};
// In actual script, above numbers will come from H list box input
For (i=1, i <= a, i++,
dt << New Column( eval("a_" || char(alist[i])), Formula(:gap*2) );
col = "a_" || char(alist[i]);
For (k=1, k <= b, k++,
eval(
substitute(
Expr(
dt << New Column( eval("a_" || char(alist[i]) || " b_" || char(blist[k])), Formula( If(:vvv > 0 & (:vvv < blist[k] ),1,0) ) );
),
Expr(vvv),
col //here gives wrong result, the formula doesn't really use column a_1, a_2, a_3, instead it use "a_1"......etc
)
)
)
)
自動化とスクリプト作成Re: expr() を使用して数式内の変数列名を置き換えますこれで何かアイデアが得られるかもしれません
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
a = 3;
b = 3;
alist = {1, 2, 3};
blist = {1, 2, 3};
// In actual script, above numbers will come from H list box input
For(i = 1, i <= a, i++,
new_col = dt << New Column(Eval("a_" || Char(alist[i])), Formula(:height* 2));
For(k = 1, k <= b, k++,
Eval(Substitute(
Expr(dt << New Column("a_" || char(new_col << get name) || " b_" || char(blist[k]),
Formula(If(vvv > 0 & (vvv < www), 1, 0))
)),
Expr(vvv), Name Expr(AsColumn(new_col)),
Expr(www), blist[k]
)
)
);
);
編集:
JMP16+ を使用している場合は、ループを For Each に変更できます (これも Eval(Substitute()) の代わりに Eval(EvalExpr()) を使用します。私の意見では、このような単純なケースではより明確です。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
alist = {1, 2, 3};
blist = {1, 2, 3};
For Each({aval}, alist,
new_col = dt << New Column("a_" || Char(aval), Formula(:height * 2));
For Each({bval}, blist,
col_title = "a_" || Char(new_col << get name) || " b_" || Char(bval);
Eval(EvalExpr(
dt << New Column(col_title, Numeric, Nominal, Formula(
If(0 < Expr(Name Expr(As Column(dt, new_col))) < Expr(bval),
1
,
0
)
))
));
);
);
Re: expr() を使用して数式内の変数列名を置換するこれで私の疑問は解決しました、ありがとう。 2 番目の方法はさらに明確に見えます
もう 1 つの質問ですが、コード内で blist[k] を直接使用していますが、「www」を使用してからそれを置き換えます。 どちらも同じ計算結果を返します
私のメソッドでは変数 blist[k] が数式内に残るため、コードの実行後にユーザーが数式を再度適用しようとすると問題が発生する可能性があるためですか?
Re: expr() を使用して数式内の変数列名を置き換えます短い答え:
はい。 blist または k への参照を失うと、式は再評価できなくなります。 両方にアクセスできる状態で数式が再評価されると、同じk は、不正確な答えが得られるすべての式に使用されます。 これを実行するとテストできるはずですdt << 式を再実行します。
もっと見る...
長い答え:
はい、評価しないと、blist[k] がデータ テーブルに残ります。 これは、すべての数式に含まれる最後の k 値になります (blist と k にアクセスできるまま数式が再評価された場合に問題になります)、およびテーブルが再度開かれた場合 (または何らかの理由で blist / k にアクセスできなくなった場合)それらはまったく存在しません。 このようなタイプのケースは、通常、式をチェックすることで簡単に検証できます。


これが簡単に発生する他の場所はグラフィック スクリプトであり、同様にグラフィック スクリプト ウィンドウから確認できます。</CODE></P>
<P> </P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Variables(X(:weight), Y(:height), Overlay(:sex)),
Elements(Points(X, Y, Legend(9)), Line Of Fit(X, Y, Legend(11)))
);
line = 60;
framebox = Report(gb)[frame box(1)];
framebox << Add Graphics Script(
H Line(line)
);
line = 70;
framebox << Add Graphics Script(
H Line(line)
);
このようなスクリプトが 2 つあります

Y = 60 には線はありません。 また、グラフビルダースクリプトをコピーすると、値の代わりに行が表示されます。
Graph Builder(
Variables(X(:weight), Y(:height), Overlay(:sex)),
Elements(Points(X, Y, Legend(9)), Line Of Fit(X, Y, Legend(11))),
SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox,
{Add Graphics Script(9, Description(""), H Line(line)),
Add Graphics Script(10, Description(""), H Line(line))}
)
)
)
これを簡単に修正するには、値を評価することです
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Variables(X(:weight), Y(:height), Overlay(:sex)),
Elements(Points(X, Y, Legend(9)), Line Of Fit(X, Y, Legend(11)))
);
line = 60;
framebox = Report(gb)[frame box(1)];
Eval(EvalExpr(
framebox << Add Graphics Script(
H Line(Expr(line))
);
));
line = 70;
Eval(EvalExpr(
framebox << Add Graphics Script(
H Line(Expr(line))
);
));
より一般的には、変数名を値に評価して置換し始める場合、場合によってはすべての変数を評価するのが良い考えであると言えます。 この場合、これが意味するのは、列タイトルも評価することが有益である可能性があるということです。
Eval(EvalExpr(
dt << New Column(Expr(col_title), Numeric, Nominal, Formula(
If(0 < Expr(Name Expr(As Column(dt, new_col))) < Expr(bval),
1
,
0
)
))
));
);
これには、たとえば、コードをデバッグするときにさらなる利点があります。 以下は、正常に動作する変数を使用して参照から列を作成する簡単な例です。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
new_col = dt << New Column("Test", Numeric, Continuous, << Set Each Value(1));
col_title = (new_col << get name) || "* var";
var = 2;
Eval(EvalExpr(
dt << New Column(col_title, Numeric, Nominal, Formula(
Expr(NameExpr(AsColumn(dt, new_col))) * Expr(var)
));
));
ただし、問題が発生した場合は、EvalExpr() とその内部のすべてを強調表示して、スクリプトのその部分を実行することができます。

Col_title は評価されません (この場合は問題ありませんが、より複雑なスクリプトがある場合は評価される可能性があります)。(この場合) もう 1 つ Expr() を追加するだけで、実際に何が起こっているのか、より多くの情報が得られます。

Re: expr() を使用して数式内の変数列名を置き換えます詳しい情報をありがとうございます。あなたの言いたいことは理解できます。例としてコードを修正します。