<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()]部分,但它适用于您引用统计列之外的任何列。 希望这能提供一些见识。
唐