別のデータ テーブルのデータに基づいて列軸の基準線を更新する別のデータ データからのデータに基づいて列参照線を追加しようとしています。 たとえば、"Big Class" を使用すると、列 "weight" と "height" がルックアップ データ テーブルの P50 と P95 の値で更新されます。
ルックアップ データ テーブルの行は、メイン テーブルの列名に対応します。 参照線は、参照テーブルの列名「P50」または「P95」からラベル値を割り当てる必要があり、値はその列の行からのものです。
追加された列軸の基準線を示す例:

ルックアップ データ テーブルの例:

私はJSLにあまり精通していないので、このトピックについて助けていただければ幸いです。 スクリプトを作成しましたが、思いどおりに動作しません。
列が壊れているように見えます。分布をプロットすると、すべて「0」の値が表示されることがあります。 また、P50 と P95 の両方の参照行を追加しようとすると、最後の行のみが列に保存され、両方の列に保存されます。
dt = Open ("C:\Program Files\SAS\JMP\15\Samples\Data\big class.jmp");
dtLookup = New Table( "Lookup Table",
Add Rows( 2 ),
New Column( "Column Name",
Character,
Nominal,
Set Values( {"weight", "height"} )
),
New Column( "P50",
"Continuous",
Set Values( [100, 61] )
),
New Column( "P95",
"Continuous",
Set Values( [120, 70] )
)
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
numRowsLookup = N Rows( dtLookup );
numColsLookup = N Cols( dtLookup );
for(n=1,n<=numRowsLookup,n++,
col_name = dtLookup[n,1];
If(contains(col_name_list,col_name),
for(j=2,j<=numColsLookup,j++,
col = Column(dt, col_name);
col_name_Lookup = col_name_list_lookup[j];
value = Column(dtLookup,col_name_Lookup)[n];
col <<
Set Property("Axis",
{
//Add Ref Line( 63, "Dashed", "Orange", "P50", 2 )
Add Ref Line( value, "Dashed", "Orange", col_name_Lookup, 2 )
});
);
);
);
ありがとうございました、
ロジャー
スクリプティングRe: 別のデータ テーブルのデータに基づいて列軸の基準線を更新するここで最終更新。 Jarmoに感謝します。
意図したとおりにこれを機能させることができました。 将来の参考のために、ここに最終的なコードを示します。
Names Default To Here(1);
namespace("here")<<REMOVE></REMOVE> New Column("P99", "Continuous", Set Values([125, 75]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
For Each Row(dtLookup,
col_name =:"Analysis Columns"n; //Ref column name
new_properties = {}; // re-init
old_properties = {}; // re-init
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
//Add Multiple Ref Lines
For( i = 2, i <= N Items( col_name_list_lookup ), i++,
new_properties_temp =
EvalExpr({
Add Ref Line(Expr(as column(dtLookup,col_name_list_lookup[i])), "Dashed", Expr(Color To RGB( 67 )),Expr(char(col_name_list_lookup[i])), 1)
});
new_properties = Insert(new_properties, new_properties_temp);
);
//end Add Multiple
//Add Specified Reference Lines
//new_properties = EvalExpr({
// Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
// Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
//});
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
//show(prop_to_add); // for debug
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",expr(prop_to_add)))); //Applies the new axis settings.
);
);
Re: 別のデータ テーブルのデータに基づいて列軸の基準線を更新するこんにちは、ヤルモです。
これについての助けに感謝します。 残念ながら、ここで古い軸と新しい軸のプロパティが更新されていませんでした。 「prop_to_add」リストに古いプロパティと新しいプロパティが追加されるのを見ましたが、実際の軸設定を確認すると、2 つの新しいプロパティしか表示されませんでした。
設定されたプロパティから中かっこを削除した後、期待どおりに動作することができました!
あとは、N 個のルックアップ列でこの作業を行う必要があります。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
Column(dt, "weight") << Set Property("Axis", {Add Ref Line(10, "Dashed", "Red", "P10", 2)}); //debugging axis property
//stop();
For Each Row(dtLookup,
//stop();
Row() = 1;
col_name = Column(dtLookup, "Column Name")[Row()]; //easier to work with without For Each Row
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
//stop();
new_properties = EvalExpr({Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2), Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)});
//stop();
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
show(prop_to_add);
//stop();
//Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{Expr(prop_to_add)}))); // Didn't work with the braces.
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",expr(prop_to_add)))); //Worked when removing the braces.
);
);Re: 別のデータ テーブルのデータに基づいて列軸の基準線を更新するコードを部分的にデバッグしてみることができます。 ループの代わりに Row() = rownumber を使用して、行ごとに For Each Row を「実行」できます。
//For Each Row(dtLookup,
Row() = 1;
col_name =:"Column Name"n;
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
old_with_new = Insert(old_properties,
{Expr( Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
)
});
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{
Expr(old_with_new)
})));
);
);
そして、行ごとにコードの実行を開始します。
old_properties = Column(dt, col_name) << get property("Axis");
//Empty()
デバッグ用のいくつかのブレークポイント (私はデバッガーを使用していませんが、デバッガーを使用するとさらに簡単になる可能性があります):
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
Column(dt, "weight") << Set Property("Axis", {Add Ref Line(10, "Dashed", "Red", "P10", 2)}); //debugging axis property
stop();
For Each Row(dtLookup,
stop();
Row() = 1;
col_name = Column(dtLookup, "Column Name")[Row()]; //easier to work with without For Each Row
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
stop();
new_properties = EvalExpr({Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2), Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)});
stop();
If(!IsList(old_properties),
prop_to_add = Name Expr(new_properties),
prop_to_add = Insert(old_properties, new_properties);
);
show(prop_to_add);
stop();
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{Expr(prop_to_add)})));
);
);
挿入のスクリプト インデックス:

スクリプト作成に役立ついくつかのリンク:
JSL構文リファレンス
スクリプトガイド
JMP 16 ヘルプ
Re: 別のデータ テーブルのデータに基づいて列軸の基準線を更新するここで Insert() 関数は何をしていますか? 私はそれがうまくいかないようです。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
col_name_list = dt << get column names(string);
col_name_list_lookup = dtLookup << get column names(string);
For Each Row(dtLookup,
col_name =:"Column Names"n;
If(contains(col_name_list,col_name),
old_properties = Column(dt, col_name) << get property("Axis");
old_with_new = Insert(old_properties,
{Expr( Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
)
});
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis",{
Expr(old_with_new)
})));
);
);Re: 別のデータ テーブルのデータに基づいて列軸の基準線を更新する100% 確実ではありませんが、最初に << Get Property("Axis") で古い Axis プロパティを取得してから、それに追加することもできます。
おそらく次のようなものです(もっと簡単な方法もあるかもしれません):
old_properties = Column(dt, "height") << get property("Axis");
old_with_new = Insert(old_properties, Expr(Add Ref Line(1, "Dashed", "Orange", "P45", 2)));
Eval(EvalExpr(column(dt, "height") << Set Property("Axis",{expr(old_with_new)})));Re: 別のデータ テーブルのデータに基づいて列軸の基準線を更新するありがとうジャルモ。 このソリューションははるかに簡単ですが、既存の軸参照線を上書きするようです。 その列に既に存在する Axis Ref Lines を保持する方法があるかどうか知っていますか?
Re: 別のデータ テーブルのデータに基づいて列軸の基準線を更新するスクリプトの例を次に示します。 私の推測では、そのように複数回実行しようとすると Axis がオーバーライドされるため、同じ << Set プロパティにそれらを追加する必要があるかもしれません (それを実行する式を構築する複数の異なる方法)。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dtLookup = New Table("Lookup Table",
Add Rows(2),
New Column("Column Name", Character, Nominal, Set Values({"weight", "height"})),
New Column("P50", "Continuous", Set Values([100, 61])),
New Column("P95", "Continuous", Set Values([120, 70]))
);
For Each Row(dtLookup,
col_name =:"Column Name"n;
//because we know we have only two lines to add and they are always added
Eval(EvalExpr(Column(dt, col_name) << Set Property("Axis", {
Add Ref Line(Expr(:P50), "Dashed", "Orange", "P50", 2),
Add Ref Line(Expr(:P95), "Dashed", "Orange", "P95", 2)
}))
);
);

かどうか分からないEval(EvalExpr())ここでは必要ですが、害はありません。
Re: 別のデータテーブルのデータに基づいて列軸の参照線を更新するAxisに直接データをインポートできるJSLスクリプトは非常に便利です。もし可能であれば、上記のJSLスクリプトに以下のラベル設定を追加していただけますか?
追加設定でコードを追加/変更しようとすると、エラーが発生します。
For( i = 2, i <= N 項目( col_name_list_lookup )、 i++,
新しいプロパティの一時 =
評価式({
参照線を追加(Expr(as column(dtLookup,col_name_list_lookup[i])), "Dashed", Expr(Color To RGB( 0 )),Expr(char(col_name_list_lookup[i])), 1,
ラベルの位置(「インライン内」)、反対軸(1))
)
});
new_properties = 挿入(new_properties、new_properties_temp);
);

Re: 別のデータテーブルのデータに基づいて列軸の参照線を更新するすべてのブラケットが正しい位置にあることを確認してください
もっと見る...
For(i = 2, i <= N Items(col_name_list_lookup), i++,
new_properties_temp = Eval Expr(
{Add Ref Line(
Expr(As Column(dtLookup, col_name_list_lookup[i])),
"Dashed",
Expr(Color To RGB(0)),
Expr(Char(col_name_list_lookup[i])),
1,
Label Position("Inside Inline"),
Opposite Axis(1)
)}
);
new_properties = Insert(new_properties, new_properties_temp);
);