【发布时间】:2022-01-22 05:12:13
【问题描述】:
当将函数中的变量名传递给另一个具有一些 dplyr 代码的函数时, 我收到未找到对象的错误消息。这只发生在我尝试在函数中传递变量名时,我可以直接运行 dplyr 函数而不会出现问题。
library(dplyr)
fun_1 <- function(data, var){
return(data %>%
summarise(mean = mean ({{var}}))
)
}
fun_2 <- function(data, var){
output <- fun_1(data = data,
var = var)
return(output)
}
直接运行第一个函数可以正常工作,但是当尝试将另一个函数中的变量名传递给 dpylr 时,我收到一条错误消息。
fun_1(iris, Sepal.Length)
mean
1 5.843333
fun_2(iris, Sepal.Length)
Error: Problem with `summarise()` column `mean`.
i `mean = mean(var)`.
x object 'Sepal.Length' not found
我试图理解为什么会发生这种情况,以及如何将数据和变量名称传递给函数内的 dyplr 函数。
【问题讨论】:
-
我认为您需要在
fun_2中添加fun_1(data = data, var = {{ var }})。 -
谢谢,这似乎解决了这个问题。但是,如果这样做,我只能将变量与 dplyr 一起使用,但不能以“正常”R 方式访问它?例如提取 fun_1 中的变量
deparse(substitute(var)的名称? -
非标准评估在可行时很“酷”,但也存在很多风险;当它失败时,它的错误可能相当迟钝和令人困惑。如果你真的想解决这个问题,那么你应该首先阅读adv-r.had.co.nz(其中讨论了这一点)。
-
我的意思是,您可以使用
var以外的名称。您可以拥有var1、var2、var3或grouping_col、mean_col、sum_col。您的函数是为一个变量编写的,但您可以编写接受多个变量的函数。 -
是的,当然,使用更多变量来传递所需信息是非常有意义的。谢谢。对我来说,我的思想有点卡在传递变量的晦涩方式上。我还查看了 Advanced R 书中的帮助/答案,但显然我还没有完全掌握非标准评估的整个概念。我还有很多东西要学。