如何将表达式“从更高级别”传递给mutate?

时间:2015-06-13 07:54:06

标签: r expression

我想创建一个包含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))起作用而失败。

我做错了什么?

由于

2 个答案:

答案 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-functionvignette("nse")

更新2018-06-21:

正如@danilinares所指出的,dplyr的首选语法自首次提出此问题以来已发生变化。使用较新版本的dplyr,可以使用整洁的评估和状态。所以这里的例子是:

library(dplyr)
fn <- function(datas, expr) {
  expr <- enquo(expr)
  mutate(datas, flag = !!expr)
}

dplyr programming article

中提供了更多信息