【问题标题】:Referring to variables by name in a dplyr function returns object not found error在 dplyr 函数中按名称引用变量返回找不到对象错误
【发布时间】:2021-05-21 10:34:14
【问题描述】:
library(nycflights13)
library(dplyr)
sum.na <- function(df,x){df %>% summarise(n=sum(is.na(x)))}
sum.na(flights, arr_time)

当我运行上面的代码时,我得到以下错误:

  **Error in eval(cols[[col]], .data, parent.frame()) : 
  object 'arr_time' not found**

【问题讨论】:

标签: r dplyr tidyverse plyr


【解决方案1】:

使用 curly-curly ({{}}) 将列名作为函数参数传递。

library(nycflights13)
library(dplyr)

sum.na <- function(df,x){df %>% summarise(n=sum(is.na({{x}})))}

sum.na(flights, arr_time)
# A tibble: 1 x 1
#      n
#  <int>
#1  8713

【讨论】:

  • 您好 Ronak,感谢您的支持,但即使使用 curly,仍然出现同样的错误
  • @Ram Hi..如我的回答中所示,它适用于nycflights13 包中的flights 数据集。你做的和我的回答有什么不同吗?
  • 不,我只是复制并粘贴了您的代码。
  • 这很奇怪。你得到什么错误?你能显示你正在使用的代码吗?
【解决方案2】:

我们也可以使用ensym!!

library(nycflights13)
library(dplyr)
sum.na <- function(df, x) { 
                 df %>%
                   summarise(n = sum(is.na(!! ensym(x))))
   }

 

既可以带引号也可以不带引号

 sum.na(flights, arr_time)
 # A tibble: 1 x 1
 #     n
 # <int>
 #1  8713

 sum.na(flights, 'arr_time')
# A tibble: 1 x 1
#      n
#  <int>
#1  8713

【讨论】:

  • 您好 Akrun,感谢您的支持。但是,当我尝试运行给定的代码时,我遇到了错误。 “!ensym(x) 中的错误:无效的参数类型”
  • @Ram 请检查您的packageVersion('dplyr')
  • 它的'1.0.3'。我需要使用其他版本吗?
  • @Ram 应该没问题。我在 R 4.0.4 上使用 1.0.4
猜你喜欢
  • 2022-01-22
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 2022-01-13
  • 2011-04-20
  • 2018-10-17
相关资源
最近更新 更多