#r #rlang
#r #rlang
Вопрос:
У меня есть tibble размером 2×2 x
, который я хочу отправить в функцию f
. Я использую rlang::dots_list()
within f
для извлечения всех именованных параметров, отправленных в f
виде многоточия ( ...
) . Результат из rlang::dots_list()
принудительно преобразуется tibble
в структуру данных.
# MRE
x <- tibble::tibble(
a = base::sample(base::letters, size = 2),
b = base::sample(base::letters, size = 2)
)
f <- function(...){
rlang::dots_list(...) %>%
tibble::as_tibble()
}
f(parameter = '1', x_name = x)
# A tibble: 2 x 2
parameter x_name$a $b
<chr> <chr> <chr>
1 1 c r
2 1 v g
# Expected behaviour
f(parameter = '1', x_name = x)
# A tibble: 1 x 2
parameter x_name$data
<chr> <list>
1 1 <tibble [2 x 2]>
Я достигаю ожидаемого блока выше, сбросив x
значение x <- tidyr::nest(x, data = tidyr::everything())
.
# Trials
f <- function(...){
rlang::dots_splice(...) %>%
tibble::as_tibble()
}
f <- function(...){
as_tibble(
!!!rlang::dots_list(...)
)
}
f <- function(...){
as_tibble(...)
}
f <- function(...){
as_tibble(
!!rlang::dots_list(...)
)
}
Комментарии:
1. Что, если вы просто используете
tibble
таким образом:tibble(parameter = '1', x_name = list(x))
? Который возвращает именно то, что вы ожидаете. В принципе,f
это была бы функцияtibble
. Вам просто нужно установитьx
в свой собственный список.
Ответ №1:
Добавив к комментарию @Edo, вы могли бы реализовать его решение с помощью purrr::map_if
и проверить, является ли объект data.frame, а затем, если он является apply list к нему:
f <- function(...){
rlang::dots_list(...) %>% purrr::map_if(is.data.frame, list) %>% tibble::as_tibble
}
f(parameter = '1', x_name = x)
# A tibble: 1 x 2
parameter x_name
<chr> <list>
1 1 <tibble [2 × 2]>