r - 您可以使用substitute() 在R 中从文本字符串创建一个函数吗?
问题描述
我正在尝试编写一个函数,允许我为 、 和 输入文本字符串field
,operator
并value
返回一个简单的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
。但我真的想要一个功能。有没有办法将调用变成一个函数,或者重写上面的代码,以便我最终得到一个工作函数?
解决方案
嗯,这很容易。解决方案是用 包装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)
按预期工作。
推荐阅读
- python - Discord.py 机器人只回复一条消息
- azure - 通过 Azure 数据工厂创建 Blob 存储容器
- typeorm - 带有子关系的Typeorm查找不起作用
- akka-stream - 为什么会出现有关早期响应的警告?
- java - 如何从 JavaFX 文本区域复制带有样式的文本?
- javascript - Javascript 读取错误的宽度值
- javascript - How to create a pixel-perfect clipping region with HTML Canvas?
- javascript - Changing color of circle mouse when moving to new section
- node.js - 无法使用 googleapis 从 Google Drive 下载文件
- arrays - 2D array definition with macros in C: weird behaviour