在另一个函数中嵌套基于 dplyr 的函数

Nested dplyr-based function within another function

感谢@MrFlick,我可以在自己的函数中处理 in usage dplyr 函数。但是另一个问题出现了。实施后 test_function:

test_function <- function(.data, ..., variable, FUN){
    dots <- eval(bquote(~FUN(.(substitute(variable)))))
    group_by_(.data,.dots = lazyeval::lazy_dots(...)) %>% 
    summarise_(.dots = dots)
}

我想在另一个函数中使用这个函数来做更多的事情:

test_function2 <– function(data, ..., variable, FUN) { 
   test_function(data, ..., variable, FUN) 
   # another computation
} 

然后我尝试了:

test_function2(diamonds, cut, clarity, variable = price, FUN - mean)

结果我得到一个错误:Error: Could not find object price。为什么?

这就是为什么尝试使用非标准评估可能会一团糟。您遇到的第一个问题是命名参​​数和 ... 参数的问题。如果你想在点之后使用参数,它们必须在调用中被命名,例如

test_function(data, ..., variable=variable, FUN=FUN) 

否则他们会在 ... 中结束所有其他内容。

下一个问题是现在您传递给 variable= 的参数是 variable。这意味着,当 test_function 尝试 substitute() 时,它会返回 variable。 R 无法判断您何时要解析符号名称。它看起来基本上与

相同
test_function(data, ..., variable=price, FUN=mean) 

处理这种复杂的 next 调用的一种方法是使用 match.call()。在这里我们做了一些额外的工作,因为你重命名了数据参数

test_function2 <- function(data, ..., variable, FUN) { 
   mc <- match.call()
   mc[[1]] <- quote(test_function)
   mc$.data <- mc$data
   mc$data <- NULL
   eval(mc)
}

基本上我们只是将传递给 test_function2 的所有内容传递给 test_function

您也可以只告诉 substitute 它应该在哪里寻找变量,将此行添加到 test_function(加上在传递这些参数时使用 variable=variableFUN=FUN

test_function <- function(.data, ..., variable, FUN){
    e <- parent.frame()
    dots <- eval(bquote(~FUN(.(substitute(variable, env=e)))))
    ...