在带有 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 部分获得更多信息
我在 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 部分获得更多信息