【问题标题】:variable not found when using ellipsis (dotdotdot) inside function with dplyr::if_else在 dplyr::if_else 函数内部使用省略号 (dotdotdot) 时找不到变量
【发布时间】:2020-10-15 23:32:24
【问题描述】:

我在 R 中有一个带有省略号 (dotdotdot) 的函数,它被解析为 dplyr::if_else,如下例所示。但是,错误告诉我,当变量确实在数据框中时,找不到该变量。我的问题很简单,如何将函数的省略号解析为管道内的 if_else 条件?我还尝试了 !!! 替代方法,将 ... 替换为正确的参数名称,但是它也不起作用

如果这是一个重复的问题,我深表歉意,但我在其他地方没有找到明确的答案。

非常感谢, 最好的,


library(tidyverse)
#> Warning: package 'tibble' was built under R version 4.0.3
data("mtcars")

myfilter <- function(df, ...) {
  
  if (...length() != 0) {
    df <- df %>% 
      mutate(
        level = if_else(..., "high", "low")
      )
    
  } else{
    df <- df %>% 
      mutate(
        level = "high"
      )
  }
  
  return(df)
  
}

# WORKS
df <- myfilter(mtcars)
"level"  %in%  names(df)
#> [1] TRUE

# DOES NOT WORK
df <- myfilter(mtcars, drat > 3)
#> Error: Problem with `mutate()` input `level`.
#> x object 'drat' not found
#> i Input `level` is `if_else(..., "high", "low")`.



myfilter2 <- function(df, condi = NULL) {
  
  if (!(is.null(condi))) {
    df <- df %>% 
      mutate(
        level = if_else(!!!condi, "high", "low")
      )
    
  } else{
    df <- df %>% 
      mutate(
        level = "high"
      )
  }
  
  return(df)
  
}

# WORKS
df <- myfilter2(mtcars)
"level"  %in%  names(df)
#> [1] TRUE

# DOES NOT WORK
df <- myfilter2(mtcars, drat > 3)
#> Error in myfilter2(mtcars, drat > 3): object 'drat' not found

reprex package (v0.3.0) 于 2020 年 10 月 15 日创建

【问题讨论】:

    标签: r function dplyr pipe ellipsis


    【解决方案1】:

    您可以使用enquos() 来捕获可以使用!!! 扩展的引号中的点中的值。这两种情况都适用。

    
    myfilter <- function(df, ...) {
      dots <- rlang::enquos(...)
      print(dots)
      if (length(dots) != 0) {
        df <- df %>% 
          mutate(
            level = if_else(!!!dots, "high", "low")
          )
        
      } else{
        df <- df %>% 
          mutate(
            level = "high"
          )
      }
      
      return(df)
    }
    myfilter(mtcars)
    myfilter(mtcars, drat > 3)
    

    您可以在 Tidy 评估指南中的 Dealing with multiple arguments 部分获取更多信息

    【讨论】:

      猜你喜欢
      • 2013-11-24
      • 1970-01-01
      • 2018-10-17
      • 2018-12-23
      • 2013-12-20
      • 1970-01-01
      • 2022-10-14
      • 2019-01-28
      • 2022-01-02
      相关资源
      最近更新 更多