Вы говорите, что хотите вернуть что-то вроде c(x2, x3, x4)
. Давайте сначала проясним, что это за объект. Это неоцененный call
для функции c
. Это не вектор имен. Вы сможете использовать его в аккуратной оценке, но для этого потребуется оператор !!
.
Это довольно сложно сделать. Вам нужно захватить аргумент predictors
и убедиться, что это либо одно имя переменной, либо вызов c
. Любое другое выражение, переданное в predictors
, вероятно, должно вызвать ошибку.
Если predictors
отсутствует и вы получаете имена столбцов в виде символов, вы должны преобразовать их в имена с помощью as.name
и вставить их в звонке c
. Если predictors
- единственная переменная, она должна быть возвращена без оценки. Если это вызов c
, он также должен быть возвращен без оценки. В противном случае выдается ошибка.
Таким образом, функция может выглядеть примерно так:
assign_predictors_argument <- function(dataset, outcome, predictors) {
if(missing(predictors)) {
predictors <- dataset %>%
dplyr::select( -{{ outcome }} ) %>%
names() %>%
sapply(as.name, USE.NAMES = FALSE)
predictors <- as.call(c(quote(c), predictors))
} else {
predictors <- as.list(match.call())$predictors
if(is.call(predictors))
{
f_name <- as.list(predictors)[[1]]
if(as.character(substitute(f_name)) != "c")
stop("'predictors' must be either a single variable or vector of names")
}
}
predictors
}
Итак, давайте проверим это:
test <- dplyr::tibble(x1 = 1:3, x2 = 2:4, x3 = 3:5, x4 = 4:6)
# Test with missing predictors
assign_predictors_argument(test, x1)
#> c(x2, x3, x4)
# Test with single predictor
assign_predictors_argument(test, x1, x2)
#> x2
# Test with multiple predictors
assign_predictors_argument(test, x1, c(x3, x4))
#> c(x3, x4)
# Test with call other than call to c
assign_predictors_argument(test, x1, as.name("x3"))
#> Error in assign_predictors_argument(test, x1, as.name("x3")):
#> 'predictors' must be either a single variable or vector of names
Все выглядит правильно. Итак, чтобы использовать его, мы могли бы сделать что-то вроде этого:
vars <- assign_predictors_argument(test, x1, c(x2, x4))
vars
#> c(x2, x4)
test %>% select(!!vars)
#> # A tibble: 3 x 2
#> x2 x4
#> <int> <int>
#> 1 2 4
#> 2 3 5
#> 3 4 6
Создано 2020-07-10 пакетом REPEX (v0.3.0)