<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />数式に必要な変数の数がわかっているかどうかに応じて、2 つの方法を使用して数式列を作成します
- Expr と Substitute は読みやすいです。 コードのセクション 1 では、mean( のリスト内の変数ごとに複数の数式列を作成します。バール、バイバール)
- Parse と eval、および場合によっては eval insert は、多数の変数を必要とする単一の数式列を作成します。その数と名前は変数リストによって設定されます。
- セクション 2a と 2b は機能し、機能的には同等です
- セクション 2c と 2d は実行されませんが、洗練された解決策への道のようです
より良い実践を生み出すためのアイデアが欲しいです。推奨事項をいただければ幸いです
名前のデフォルトは Here( 1 );
n=ntable();
dtnms={};
もしも(
n==0、dtc=1、
n==1, If(current data table() << get name == "Big Class", dtc=0, dtc=1) , // else
for(ii=1, ii <= n, ii++, insert into(dtnms, data table(ii) << getname));
if(contains(dtnms, "ビッグクラス") > 0, dtc=1, dtc=0);
);
if (dtc,dt = Open( "$SAMPLE_DATA/Big Class.jmp" ), dt = データ テーブル("Big Class"));
// セクション 1: 変数を動的に入力する数式の列をいくつか追加します。
Form1=expr(
form1col=dt << 新しい列(名前, 式(col means(列として(YVar), 列として(ByVar))))
);
VarList={"性別"、"身長"、"体重"};
For(ii=2, ii <= N Items(VarList), ii++,
Eval(Substitute(Name expr(form1),
expr(名前), VarList[ii]||" 平均",
expr(YVar)、VarList[ii]、
expr(ByVar)、VarList[1]、
));
);
// セクション 2: 変数リスト内の列を平均します。
// 方法 2a 方法は機能しますが、デバッグが困難です
VarList={"身長"、"体重"、"年齢"};
Formtxt1 = "formcol = dt << 新しい列(\!"方法 a: 平均\!", Formula(mean( ";
Formtxt2 = "列として(\!""||VarList[1]||"\!")";
もしも(
N Items(VarList)==2, Formtxt2 ||= ", As Column(\!""||VarList[2]||"\!")",
N 項目 (VarList)>2、For(ii=2、ii <= N 項目 (VarList)、ii++、
Formtxt2 ||= ", 列として(\!""||VarList[ii]||"\!")"
)
);
Formtxt=Formtxt1||Formtxt2||");";
eval(parse(Formtxt));
// 方法 2b: いくらか見やすくなります
Col4=expr(
NewCol1=dt << New Column("方法 b: 平均値 "||_names_);
);
form4txt="NewCol1 <
VarList={"身長"、"体重"、"年齢"};
VarRef = eval list(dt << get Column Reference(VarList));
_Vars_ = "列として( \!"" || ConCat Items(VarList, "\!"), 列として( \!"") || "\!")";
form4txta = Eval Insert(form4txt);
Eval(Substitute(Name expr(col4),
expr(_names_)、concat Items(VarList,", ",)
));
Eval(Parse(form4txta)); //Parse はテキストを評価される expr にします
// *************************************** //
// ************* 動作しません ************* //
//方法 2c: これが最善だと思いますが、正しくすることができません - まだリストがあります
form3=expr(
NewCol=dt << New Column("平均値 "||_names_, Formula(Mean(_Vars_ )));
);
VarList={"身長"、"体重"、"年齢"};
VarRef = eval list(dt << get Column Reference(VarList));
Eval(Substitute(Name expr(form3),
expr(_names_), concat Items(VarList,", ",),
expr(_Vars_)、VarRef
));
// 方法 2d: ループを使用しますが、それでも正しくありません
form4=expr(
NewCol=dt << New Column("平均値 "||_names_, Formula(Mean(_Vars_ )));
);
VarList={"身長"、"体重"、"年齢"};
VarRef = eval list(dt << get Column Reference(VarList));
Form4a =Substitute(名前 expr(form4),
expr(_names_)、concat Items(VarList,", ",)
);
For(ii=1, ii <= N Items(VarList), ii++,
form4a=Substitute(名前 expr(form4a),
expr(_Vars_)、expr(VarRef[ii]、_Vars_)
);
);
Eval(Substitute(Name expr(form4a),
expr(_Vars_), ""
));
// *************************************** //
// ************* 動作しません ************* //
さまざまなメソッドの素晴らしいコレクション。
最近、このような場合には文字列ではなく式を使用することを好むようになりました。 JSL で数式を設定するには、最初に EvalExpr() を使用して式を構築し、次に実行時の評価を避けるために NameExpr() を使用して式を挿入します。
以下に、列名のリストまたは文字列のリストに基づく 2 つの例を示します。後者は少し難しくなります。
dt =開ける( "$SAMPLE_DATA/Big Class.jmp" ) ;
// 1. 列名のリスト
L1 = {年、身長、重さ} ; // つまり dt<<列名(数値)を取得;
フォーム1 =評価式(平均(エクスプレッション( L1 ))) ;
フォーム1列= dt <<新しい列(連結アイテム(言葉(シャア( L1 ) 、 「{}、」 )) || " 平均" 、方式(名前の説明(フォーム1 ))) ;
// 2. 文字列のリスト
L2 = { "年" 、 "身長" 、 "重さ" } ; // つまり dt<<列名を取得(数値, 文字列);
フォーム2 =評価式(
平均(
エクスプレッション(
繰り返す(
私= 0 ;
{私++ ;評価式(列として(エクスプレッション( L2 [私])))} ;,
N 個のアイテム( L2 )
)
)
)
) ;
フォーム2コル= dt <<新しい列(連結アイテム( L2 ) || " 平均" 、方式(名前の説明(フォーム2 ))) ;