将变量名称传递给另一个函数中的 dplyr 函数会返回找不到对象错误
Posted
技术标签:
【中文标题】将变量名称传递给另一个函数中的 dplyr 函数会返回找不到对象错误【英文标题】:Passing a variable name to a dplyr function within another function returns object not found error 【发布时间】: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 书中的帮助/答案,但显然我还没有完全掌握非标准评估的整个概念。我还有很多东西要学。
【参考方案1】:
这似乎是一个可见性问题。 R 有相当复杂的范围规则。为确保您正确传递调用,如下所示:
fun_1(iris, iris$Sepal.Length)
fun_2(iris, iris$Sepal.Length)
或者,只需将var
作为字符串传递:
library(dplyr)
fun_1 <- function(data, var)
data %>% summarise(mean=mean(data[[var]]))
fun_2 <- function(data, var)
fun_1(data, var)
fun_1(iris, 'Sepal.Length')
fun_2(iris, 'Sepal.Length')
【讨论】:
谢谢您,您的两个建议都可以作为解决方法。如果您愿意,您甚至可以添加 Martin Gal 的答案(在 cmets 中)作为您答案的第三种解决方案,以便我们在一个答案中拥有所有可能的解决方案。以上是关于将变量名称传递给另一个函数中的 dplyr 函数会返回找不到对象错误的主要内容,如果未能解决你的问题,请参考以下文章