事实证明需要定义一个函数eval_string
它评估一个字符串,就像它是一个表达式(/调用)一样。例如,如果:
string <- 'cyl == 6 & disp > 200'
我想要:
eval_string(string, mtcars)
相当于:
eval(quote(cyl == 6 & disp > 200), mtcars)
这是我的尝试:
eval_string <- function(string, ...) eval(parse(text = string), ...)
这似乎有效,但是,我知道parse
是不受欢迎的,并且对这种类型的编程没有太多经验(无论它是什么?)。所以我的问题是:是否有更规范的方式来实现我想要的?为了在问题背后提供一些背景信息,eval_string
将与shiny
;特别是,textInput
功能。
为任何帮助干杯。
编辑:谢谢大家的评论。当我使用textInput
为了对数据框进行子集化,在哈德利指南的帮助下,我也提出了这个解决方案:
library(pryr)
subset_with_string <- function(string, data) {
expr <- parse(text = string)[[1]]
subset_calls <- c("==", "!=", "&", "|", ">", "<", ">=", "<=", "(")
legal_call <- all(fun_calls(expr) %in% subset_calls)
if (legal_call) {
data[eval(expr, data), ]
}
else {
stop('string does not induce a legal subset call to evaluate!')
}
}
subset_with_string("(cyl == 6 & hp > 100) | gear == 4", mtcars)
subset_with_string("rm('importantFile.doc')", mtcars)