【问题标题】:Getting error: Error in UseMethod("filter") : no applicable method for 'filter' applied to an object of class "logical"出现错误:UseMethod(“过滤器”)中的错误:没有适用于“过滤器”的方法应用于“逻辑”类的对象
【发布时间】:2021-04-22 17:39:46
【问题描述】:

我很困惑,因为我认为逻辑表达式是filter() 函数的参数之一?这是我的代码:

simplifyList <- function(x) {
    x <- x %>% {
        filter(x$Q26 == "Yes")
    }
}
simplifyList(a)

我已经检查以确保 a 属于 data.frame 类,并且在 filter() 前面添加 dplyr:: 没有做任何事情。我什至更新了 dplyr 包,以防出现问题。我有什么遗漏吗?

【问题讨论】:

    标签: r filter dplyr


    【解决方案1】:

    这是因为您在管道表达式的右侧使用了大括号 {}

    x <- x %>% { ... }
    

    并且您在filter 表达式中直接引用了您的数据集x

    filter(x$Q26 == "Yes")
    

    这两个很可能都不正确。第一个见%&gt;%的帮助:

    通过 %>%

    使用 lambda 表达式

    每个 rhs 本质上是一元函数的一个表达式体。因此在 magrittr 中定义 lambdas 是非常自然的,并且作为常规函数的定义:如果需要多个表达式,则将主体括在一对大括号 { rhs } 中。但是,请注意,在大括号内没有“第一个参数规则”:这与编写参数名称为“.”的一元函数完全一样。 (点)。

    所以不是x %&gt;% { &lt;expression referring to x&gt; },而是类似

    x <- x %>% { filter(.$Q26 == "Yes" }
    

    会工作的。或者你可以去掉括号并写

    x <- x %>% filter(x$Q26 == "Yes")
    

    这也可以。但你真正想做的是

    x <- x %>% filter(Q26 == "Yes")
    

    或者干脆

    x <- filter(x, Q26 == "Yes")
    

    这避免了与管道有关的任何问题。

    【讨论】:

      【解决方案2】:

      没有示例数据很难完全诊断,但请尝试:

      simplifyList <- function(x) {
          x %>%
              filter(Q26 == "Yes")
      }
      simplifyList(a)
      

      【讨论】:

        【解决方案3】:

        我还没有弄清楚为什么,但问题是你应该使用Q26 == "Yes"而不是x$Q26 == "Yes"

        library(dplyr)
        dd <- data.frame(x=1:2, Q26=c("Yes","No"))
        simplifyList <- function(x) { x <- x %>% filter(Q26=="Yes") ; return(x) }
        simplifyList(dd)
        

        (对我来说)x$Q26 不起作用的原因远非显而易见——它一定与 tidyverse 的特定评估规则有关,或者它们与函数参数评估的交互:

        • with(dd, identical(dd$Q26, Q26))——这是我认为模仿 tidyverse 规则的方式——是正确的。
        • dd %&gt;% filter(dd$Q26 == "Yes") 在函数之外工作...

        【讨论】:

          【解决方案4】:

          如果您在正确的位置使用{} 标志,您可以使您所写的内容生效:

          library(dplyr)
          
          a <- data.frame(x = 1:2, Q26 = c("Yes","No"))
          
          simplifyList <- function(x) {
            x <- x %>% 
              filter({{x}}$Q26 == "Yes")
            x
          }
          
          simplifyList(a)
          #>   x Q26
          #> 1 1 Yes
          
          

          但我不建议您使用这种不寻常的语法。 相反,我会这样做:

          simplifyList <- function(x) {
            x %>%
              filter(Q26 == "Yes")
          }
          
          simplifyList(a)
          #>   x Q26
          #> 1 1 Yes
          

          或者那个:

          simplifyList <- function(x) {
            filter(.data = x, Q26 == "Yes")
          }
          
          simplifyList(a)
          #>   x Q26
          #> 1 1 Yes
          

          我希望这会有所帮助……

          reprex package (v2.0.0) 于 2021-04-25 创建

          【讨论】:

            猜你喜欢
            • 2019-09-12
            • 2022-12-15
            • 2023-01-22
            • 1970-01-01
            • 2018-03-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多