首页 > 解决方案 > 您可以使用substitute() 在R 中从文本字符串创建一个函数吗?

问题描述

我正在尝试编写一个函数,允许我为 、 和 输入文本字符串fieldoperatorvalue返回一个简单的dplyr::filter函数,然后我可以将其应用于数据集。

例子:

library(dplyr)
field <- "Species"
operator <- "=="
value <- "virginica"
myfun <- substitute(
   function(x) filter(x, EXPR(FIELD, VALUE)),
   list(
     FIELD = as.symbol(field),
     EXPR = as.symbol(operator),
     VALUE = value
   )
 )
myfun
function(x) filter(x, Species == "virginica")

到目前为止,一切都很好,对吧?看起来我们都准备好了。但没那么快:

> myfun(iris)
Error in myfun(iris) (from foo.R!10Zf0E#19) : could not find function "myfun"

如果我键入class(myfun),结果证明我创建了一个名为 a 的东西call。但我真的想要一个功能。有没有办法将调用变成一个函数,或者重写上面的代码,以便我最终得到一个工作函数?

标签: rfunctiondplyrsubstitutionnse

解决方案


嗯,这很容易。解决方案是用 包装substitute()eval()如下所示:

> myfun <- eval(
      substitute(
        function(x) filter(x, EXPR(FIELD, VALUE)),
        list(
          FIELD = as.symbol(field),
          EXPR = as.symbol(operator),
          VALUE = value
        )
      )
    )

然后myfun(iris)按预期工作。


推荐阅读