gpt4 book ai didi

R:评估一个字符串

转载 作者:行者123 更新时间:2023-12-02 03:39:26 24 4
gpt4 key购买 nike

事实证明,有必要定义一个函数 eval_string,它将一个字符串作为一个表达式(/call)来求值。例如,如果:

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 对数据框进行子集化时,在 Hadley 指南的帮助下,我也想出了这个解决方案:

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)

最佳答案

为了避免使用 eval,我在 Shiny 应用程序中使用了以下内容:

dat <- try(do.call(subset, list(data,parse(text = string))), silent = TRUE)

if(!is(dat, 'try-error')) return(dat)

关于R:评估一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21024404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com