检查 tidyselect 是否为 NULL,如果是,则设置默认的 tidyselect 方法
Check if a tidyselect is NULL and if so, set a default tidyselect method
如果给出 NULL,我很难设置默认选择方法。
例如,假设我想实现一个函数,对某些 tidyselect 方法、符号或字符串的所有值进行平方,如果给出 none,则默认情况下它对所有数值进行平方。
这是我正在努力工作的案例的代表:
#Load package
suppressMessages(library(dplyr))
#Define function
square_columns <- function(data, target = NULL){
if (is.null(target)){
target <- rlang::expr(where(is.numeric))
}
data %>%
dplyr::mutate(
dplyr::across(!!target, magrittr::raise_to_power, 2)
)
}
# Examples
# Works
iris %>%
square_columns(target = 'Sepal.Length') %>%
invisible()
# Works
iris %>%
square_columns(target = c('Sepal.Length', 'Sepal.Width')) %>%
invisible()
# Works
iris %>%
square_columns() %>%
invisible()
# Fails
iris %>%
square_columns(target = contains('Sepal'))
#> Error: `contains()` must be used within a *selecting* function.
#> i See <https://tidyselect.r-lib.org/reference/faq-selection-context.html>.
# Fails
iris %>%
square_columns(target = Sepal.Length)
#> Error in square_columns(., target = Sepal.Length): object 'Sepal.Length' not found
由 reprex package (v2.0.0)
于 2021 年 6 月 16 日创建
您需要更加小心 target
实际评估的时间。这应该有效
square_columns <- function(data, target = NULL){
target <- enquo(target)
if (rlang::quo_is_null(target)){
target <- rlang::expr(where(is.numeric))
}
data %>%
dplyr::mutate(
dplyr::across(!!target, magrittr::raise_to_power, 2)
)
}
当您 运行 is.null(target)
时,您正在评估该参数,您无法评估在 data.frame 上下文之外使用 contains()
的内容。所以最好从参数中显式创建一个quosure并使用更安全的rlang::quo_is_null
来检查NULL值。
如果给出 NULL,我很难设置默认选择方法。 例如,假设我想实现一个函数,对某些 tidyselect 方法、符号或字符串的所有值进行平方,如果给出 none,则默认情况下它对所有数值进行平方。 这是我正在努力工作的案例的代表:
#Load package
suppressMessages(library(dplyr))
#Define function
square_columns <- function(data, target = NULL){
if (is.null(target)){
target <- rlang::expr(where(is.numeric))
}
data %>%
dplyr::mutate(
dplyr::across(!!target, magrittr::raise_to_power, 2)
)
}
# Examples
# Works
iris %>%
square_columns(target = 'Sepal.Length') %>%
invisible()
# Works
iris %>%
square_columns(target = c('Sepal.Length', 'Sepal.Width')) %>%
invisible()
# Works
iris %>%
square_columns() %>%
invisible()
# Fails
iris %>%
square_columns(target = contains('Sepal'))
#> Error: `contains()` must be used within a *selecting* function.
#> i See <https://tidyselect.r-lib.org/reference/faq-selection-context.html>.
# Fails
iris %>%
square_columns(target = Sepal.Length)
#> Error in square_columns(., target = Sepal.Length): object 'Sepal.Length' not found
由 reprex package (v2.0.0)
于 2021 年 6 月 16 日创建您需要更加小心 target
实际评估的时间。这应该有效
square_columns <- function(data, target = NULL){
target <- enquo(target)
if (rlang::quo_is_null(target)){
target <- rlang::expr(where(is.numeric))
}
data %>%
dplyr::mutate(
dplyr::across(!!target, magrittr::raise_to_power, 2)
)
}
当您 运行 is.null(target)
时,您正在评估该参数,您无法评估在 data.frame 上下文之外使用 contains()
的内容。所以最好从参数中显式创建一个quosure并使用更安全的rlang::quo_is_null
来检查NULL值。