<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我使用兩種方法來創建公式列,具體取決於我是否知道公式需要多少個變量
- Expr 和 Replace 很容易閱讀。 代碼中的第 1 部分為mean( 列表中的每個變量創建了多個公式列var, 拜瓦爾)
- 解析和 eval 以及可能的 eval insert 創建一個需要多個變量的公式列,數量和名稱由變量列表設置。
- 第 2a 和 2b 節有效且功能相同
- 第 2c 和 2d 部分未運行,但似乎是通往優雅解決方案的道路
我想要創建更好的實踐的想法,並且希望得到建議
名稱默認為此處( 1 );
n=ntable();
dtnms={};
如果(
n==0,dtc=1,
n==1, If(當前數據表() << get name == "大類", dtc=0, dtc=1) , // else
for(ii=1, ii <= n, ii++, insert into(dtnms, 數據表(ii) << getname));
if(包含(dtnms, "大類") > 0, dtc=1, dtc=0);
);
if (dtc,dt = Open( "$SAMPLE_DATA/Big Class.jmp" ), dt = 數據表("Big Class"));
// 第 1 部分:添加幾列動態輸入變量的公式。
形式1=表達式(
form1col=dt << 新列(名稱, 公式(col 平均值(作為列(YVar), 作為列(ByVar))))
);
VarList={"性別","身高","體重"};
For(ii=2, ii <= N Items(VarList), ii++,
Eval(替換(名稱 expr(form1),
expr(名稱), VarList[ii]||"平均值",
expr(YVar), VarList[ii],
expr(ByVar), VarList[1],
));
);
// 第 2 部分:對變量列表中的列進行平均
// 方法2a 方法可以工作,但是很難調試
VarList={"身高","體重","年齡"};
Formtxt1 = "formcol = dt << new column(\!"方法a:平均值\!", 公式(mean( ";
Formtxt2 = "As Column(\!""||VarList[1]||"\!")";
如果(
N 項(VarList)==2, Formtxt2 ||= ", As Column(\!""||VarList[2]||"\!")",
N 項(VarList)>2, For(ii=2, ii <= N 項(VarList), ii++,
Formtxt2 ||= ", As Column(\!""||VarList[ii]||"\!")"
)
);
Formtxt=Formtxt1||Formtxt2||");";
評估(解析(Formtxt));
// 方法 2b:更容易看到
col4=表達式(
NewCol1=dt << 新列("方法 b:"||_names_ 的平均值);
);
form4txt="NewCol1 <<公式(Mean( ^_Vars_^ )))";
VarList={"身高","體重","年齡"};
VarRef = eval list(dt << 獲取列引用(VarList));
_Vars_ = "As Column( \!"" || ConCat Items(VarList, "\!"), As Column( \!"") || "\!")";
form4txta = 評估插入(form4txt);
Eval(替換(名稱 expr(col4),
expr(_names_), concat Items(VarList,", ",)
));
評估(解析(form4txta)); //Parse 使文本成為要計算的 expr
// ************************************** //
// ************* 不工作 ************* //
//方法2c:我認為這是最好的,但我不能使它正確 - 仍然有一個列表
形式3=表達式(
NewCol=dt << 新列("平均值"||_names_, 公式(Mean(_Vars_ )));
);
VarList={"身高","體重","年齡"};
VarRef = eval list(dt << 獲取列引用(VarList));
Eval(替換(名稱 expr(form3),
expr(_names_), concat Items(VarList,", ",),
expr(_Vars_), VarRef
));
// 方法2d:使用循環,但仍然不正確
形式4=表達式(
NewCol=dt << 新列("平均值"||_names_, 公式(Mean(_Vars_ )));
);
VarList={"身高","體重","年齡"};
VarRef = eval list(dt << 獲取列引用(VarList));
Form4a =替換(名稱 expr(form4),
expr(_names_), concat Items(VarList,", ",)
);
For(ii=1, ii <= N Items(VarList), ii++,
form4a=替換(名稱 expr(form4a),
expr(_Vars_), expr(VarRef[ii], _Vars_)
);
);
Eval(替換(名稱 expr(form4a),
expr(_Vars_), ""
));
// ************************************** //
// ************* 不工作 ************* //
不同方法的很好的集合。
最近,在這種情況下,我開始更喜歡使用表達式而不是字符串。 為了通過 JSL 設置公式,我首先使用 EvalExpr() 構建表達式,然後使用 NameExpr() 插入該表達式以避免在運行時求值。
下面是兩個基於列名列表或字符串列表的示例,後者更具挑戰性。
dt =打開( “$SAMPLE_DATA/大類.jmp” ) ;
// 1. 列名稱列表
L1 = {年齡,高度,重量} ; // 即 dt<< 獲取列名(數字);
表格1 =求值表達式(意思是(表達式( L1 ))) ;
表格1列= dt <<新專欄(連接項目(字(查爾( L1 ) , “{},” )) || “ 平均的” ,公式(名稱表達式(表格1 ))) ;
// 2. 字符串列表
L2 = { “年齡” , “高度” , “重量” } ; // 即 dt<< 獲取列名(數字,字符串);
表格2 =求值表達式(
意思是(
表達式(
重複(
我= 0 ;
{我++ ;求值表達式(作為列(表達式( L2 [我])))} ;,
N 項( L2 )
)
)
)
) ;
表格2列= dt <<新專欄(連接項目( L2 ) || “ 平均的” ,公式(名稱表達式(表格2 ))) ;