<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我經常遇到如何編寫公式腳本的問題(使用與公式中的引用列有關的內容將相同的公式應用於多個列)。 通常,這也是人們開始編寫腳本的入口,因此他們是新手。
我最近在常規討論部分中發布了一個問題,試圖讓我的客戶參與(他們沒有參加)和一些專家建議(任何閱讀此書的人)。 我真的很想產生一個可靠的答案,當這個問題出現時,我可以向大家指出。 例如,如果您有1000多個列等,建議的答案真的是最好的方法嗎?
任何幫助,將不勝感激。 或博客條目。 還是指出這已經被其他地方覆蓋了?
常規討論在這裡:
將列公式編寫成許多列的最佳方法?
謝謝!
作為前面的後續:您會注意到我對列名使用了:Name()函數。 這有助於避免由於列名中包含有趣的字符而引起的任何問題。 並非總是需要,但再次要注意。
遵循Don所說的,我經常發現自己使用Eval(Parse(Substitute()))進一步走了一步。
實際上,這實際上是動態編寫代碼。 雖然有點不雅觀,但幾乎是防彈的。 這種構造並不總是最有效的(由於字符替換),但是當所有其他技巧都失敗時,這種構造就會成功,因此很高興知道這一點。 最大的缺點是,由於以下原因,您看不到顏色代碼:
名稱默認為此處( 1個) ;
dt =打開( “ $ Sample_Data / football.jmp” ) ;
codeFrag = “ \ [
新列(“ _colName_平均排名”,
數字,
“連續”,
格式(“最佳”,12),
公式(Col Rank(Abs(Col Mean(:Name(“ _colName_”))-:Name(“ _colName_”)))))
)
] \“ ;
colList = dt << getcolumnnames (串) ;
對於(一世= 1個,一世<=下位(同事) ,一世++,
如果(柱( dt , colList [一世]) <<獲取建模類型== “連續” ,
評估(解析(替代( codeFrag , “ _colName_” , colList [一世])))
)
) ;
如果缺少顏色編碼,您可以通過將字符串包裝在char(nameexpr())構造中進行維護,如下所示。 這增加了複雜性,但是在出於調試目的而編寫代碼時可能值得這樣做...一旦工作,您總是可以去除char(nameexpr())片段,並使用“ \ [] \”放入引號中。
底線:這不會贏得選美比賽,但是當您自己編寫字符串,分析並評估它時,您將得到想要的。 當Eval(EvalExpr(...... Expr()....))失敗,您將無法弄清(或沒有時間弄清楚或不在乎)原因。
名稱默認為此處( 1個) ;
dt =打開( “ $ Sample_Data / football.jmp” ) ;
codeFrag =燒焦(名稱表達式(
新專欄( “ _colName_平均排名” ,
數字,
“連續” ,
格式( “最好” , 12 ) ,
式(上校排名(腹肌( Mean均值( :名稱( “ _colName_” )) -- :名稱( “ _colName_” ) ) ) )
)
)) ;
colList = dt << getcolumnnames (串) ;
對於(一世= 1個,一世<=下位(同事) ,一世++,
如果(柱( dt , colList [一世]) <<獲取建模類型== “連續” ,
評估(解析(替代( codeFrag , “ _colName_” , colList [一世])))
)
) ;
乾杯,
布雷迪
勞拉
我認為論壇中給出的答案是一種可靠的方法,不會使代碼更加複雜。 我認為在這種情況下不可避免要使用Expr和Name Expr。 下一步,您可以考慮從循環中刪除公式,以使代碼更通用。 這樣,您可以創建一個將公式作為參數的函數(請參見隨附的JSL)。 可能有一種更簡單的方法來執行此操作,但是我習慣於使用Substitute(而且非常健壯)。 不確定為什麼需要[Row()]部分,但它適用於您引用統計列之外的任何列。 希望這能提供一些見識。
唐