在另一个函数中嵌套基于 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=variable
和 FUN=FUN
)
test_function <- function(.data, ..., variable, FUN){
e <- parent.frame()
dots <- eval(bquote(~FUN(.(substitute(variable, env=e)))))
...
感谢@MrFlick,我可以在自己的函数中处理 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=variable
和 FUN=FUN
)
test_function <- function(.data, ..., variable, FUN){
e <- parent.frame()
dots <- eval(bquote(~FUN(.(substitute(variable, env=e)))))
...