<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()] 部分,但它适用于您引用列的任何时候,除了在统计列函数内。 希望这能提供一些见解。
大学教师