将变量名称传递给另一个函数中的 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 以外的名称。您可以拥有var1var2var3grouping_colmean_colsum_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 函数会返回找不到对象错误的主要内容,如果未能解决你的问题,请参考以下文章

将一个dplyr“do”函数的结果传递给另一个函数

将变量传递给另一个 JAVA 类中的主函数

函数R中的Dplyr变量名称

将一个函数中创建的 PHP 变量传递给另一个函数

将字符串传递给 R 函数参数,但稍后用作另一个函数的参数名称

将变量传递给另一个页面上的函数