R中带有运算符的用户指定函数

Posted

技术标签:

【中文标题】R中带有运算符的用户指定函数【英文标题】:User specified function with operators in R 【发布时间】:2015-07-19 10:32:29 【问题描述】:

我想使用用户指定的函数并将该函数应用于值列表。我设想用户将给出一个“公式”作为包含变量和运算符名称的字符串,例如"a * b %% c - d / e ^ f + g %/% h".

以下玩具示例有效

prmlist <- list(a=1:10, b=21:30, c=31:40, d=4, e=5, f=6, g=7, h=8) 
with(prmlist, a * b %% c - d / e ^ f + g %/% h)

当我想在函数中使用这种方法时,问题就开始了。为此,我必须在函数内获取用户指定的“公式”。字符串似乎是明显的路线。问题是如何在函数内部评估它。 do.call() 似乎不适合,因为运算符每个都是一个函数。我希望像

这样简单的东西
my.formula <- "a * b %% c - d / e ^ f + g %/% h"
with(prmlist, eval(my.formula)) 

会起作用,但不会。

【问题讨论】:

with(prmlist, eval(parse(text = my.formula))),但请记住有关安全性的常见警告。如果没有更好的方法,我会非常仔细地考虑。 【参考方案1】:

您可以使用 substitute() 来调用您的操作员:

my.formula <- substitute(a * b %% c - d / e ^ f + g %/% h)
with(prmlist, eval(my.formula)) 
 [1]  20.99974  43.99974  68.99974  95.99974 124.99974 155.99974 188.99974
 [8] 223.99974 260.99974 299.99974

更新:如果命令是字符串,你可以使用parse

myCmd <- "a * b %% c - d / e ^ f + g %/% h"
with(prmlist, eval( parse(text=myCmd) ))
 [1]  20.99974  43.99974  68.99974  95.99974 124.99974 155.99974 188.99974
 [8] 223.99974 260.99974 299.99974

【讨论】:

但是用户会将my.formula作为字符串给出。这就是我要解决的问题 谢谢。正是我需要的

以上是关于R中带有运算符的用户指定函数的主要内容,如果未能解决你的问题,请参考以下文章

mongoose.js 中带有查询生成器的 OR 运算符

mysql怎么用like检索字段中带有数字的语句?

.append 中带有三元 `:?` 运算符的 jQuery 错误?

默认参数中带有百分号的 Gas altmacro 宏因“% 运算符需要绝对表达式”而失败

一些R语言的基本概念

R语言