我想创建一个包含mutate的更高级别的函数。我想给我的函数赋一个表达式参数,并且能够在mutate中使用这个表达式:
datas <- data.frame(x = sample(100))
fn <- function(datas, expr) {
mutate(datas, flag = eval(substitute(expr), datas))
}
fn(datas[1], x > 50)
Error in mutate_impl(.data, dots) : object 'x' not found
但我不明白为什么它会因mutate(datas, flag = eval(substitute(x > 50), datas))
起作用而失败。
我做错了什么?
由于
答案 0 :(得分:4)
试试这个:
fn <- function(df, expr)
eval(substitute(mutate(df, expr), list(expr=substitute(expr))))
或(最好)这个:
fn <- function(df, expr)
mutate_(df, .dots= list(flag=substitute(expr)))
答案 1 :(得分:3)
最好的选择可能是使用dplyr::mutate_
设计用于此类场景的非标准评估在函数中存在问题。
fn <- function(datas, expr) {
expr <- substitute(expr)
dplyr::mutate_(datas, flag = expr)
}
请参阅http://adv-r.had.co.nz/Computing-on-the-language.html#calling-from-another-function和vignette("nse")
。
更新2018-06-21:
正如@danilinares所指出的,dplyr
的首选语法自首次提出此问题以来已发生变化。使用较新版本的dplyr
,可以使用整洁的评估和状态。所以这里的例子是:
library(dplyr)
fn <- function(datas, expr) {
expr <- enquo(expr)
mutate(datas, flag = !!expr)
}
中提供了更多信息