<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我經常遇到如何編寫公式腳本的問題(將相同的公式應用於多個列,使用有關公式中參考列的內容)。 這通常也是人們開始編寫腳本的入口,所以他們是新手。
我最近在常規討論部分發布了一個問題,試圖讓我的客戶參與(他們沒有)和一些專家建議(任何讀過這篇文章的人)。 我真的很想給出一個可靠的答案,當這個問題出現時我可以向人們指出。 例如,如果您有 1000 多列等,建議的答案真的是最好的方法嗎?
對此的任何幫助將不勝感激。 或部落格條目。 或指出這已在其他地方介紹過?
常規討論在這裡:
將列公式編寫為多列的最佳方法?
謝謝你!
作為上一個的後續:您會注意到我使用 :Name() 函數作為列名稱。 這有助於避免因列名中包含有趣的字元而引起的任何問題。 並不總是需要,但同樣,防彈。
按照 Don 所說,我常常發現自己更進一步,使用 Eval(Parse(Substitute()))。
實際上,這實際上是動態編寫程式碼。 雖然有些不雅,但它幾乎是刀槍不入的。 這種構造並不總是最有效的(由於字元替換),但是當所有其他技巧都失敗時,它是成功的,所以了解一下是件好事。 最顯著的缺點是由於引用而無法看到顏色編碼:
名稱預設為此處( 1 ) ;
dt =打開( “$Sample_Data/football.jmp” ) ;
程式碼片段= “\[
新列(“_colName_平均值排名”,
數字,
“連續的”,
格式(“最佳”,12),
公式( Col Rank( Abs( Col Mean( :Name( "_colName_" )) - :Name( "_colName_" ) ) ) )
)
]\" ;
列列表= dt <<取得列名(細繩) ;
為了(我= 1 ,我<=尼特姆斯(碰撞) ,我++,
如果(柱子( dt ,列列表[我]) <<取得建模類型== “連續的” ,
評估(解析(代替(程式碼片段, “_colName_” ,列列表[我])))
)
) ;
如果缺少顏色編碼令您煩惱,您可以透過將字串包裝在 char(nameexpr()) 建構中來維護它,如下所示。 這增加了複雜性,但在編寫用於調試目的的程式碼時可能是值得的......一旦它起作用,您總是可以刪除char(nameexpr()) 部分並使用“\[ ]\ 」放入引號中。
底線:這不會贏得選美比賽,但是當您自己編寫字串、解析它並評估它時,您將得到您想要的東西。 將其放在後口袋中,以便 Eval(EvalExpr( ...... Expr() .... )) 失敗,而且您無法弄清楚(或沒有時間弄清楚,或不關心)原因。
名稱預設為此處( 1 ) ;
dt =打開( “$Sample_Data/football.jmp” ) ;
程式碼片段=字元(名稱表達式(
新專欄( “_colName_ 平均值排名” ,
數位,
“連續的” ,
格式( “最好的” , 12 ) ,
公式(上校軍階(腹肌(科爾平均值( :姓名( “_colName_” )) - :姓名( “_colName_” ) ) ) )
)
)) ;
列列表= dt <<取得列名(細繩) ;
為了(我= 1 ,我<=尼特姆斯(碰撞) ,我++,
如果(柱子( dt ,列列表[我]) <<取得建模類型== “連續的” ,
評估(解析(代替(程式碼片段, “_colName_” ,列列表[我])))
)
) ;
乾杯,
布雷迪
勞拉,
我認為論壇中給出的答案是一種可靠的方法,不會使程式碼變得過於複雜。 我認為在這種情況下使用 Expr 和 Name Expr 是不可避免的。 下一步,您可能會考慮從循環中刪除公式以使程式碼更通用。 這樣,您就可以建立一個將公式作為參數的函數(請參閱隨附的 JSL)。 可能有一種更簡單的方法可以做到這一點,但我非常習慣使用 Substitute (而且它非常強大)。 不知道為什麼需要 [Row()] 部分,但它適用於您引用列的任何時候,除了在統計列函數內。 希望這能提供一些見解。
大學教師