在带有 dplyr::if_else 的函数内部使用省略号(点点)时找不到变量

variable not found when using ellipsis (dotdotdot) inside function with dplyr::if_else

我在 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 创建

您可以使用 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 部分获得更多信息