Возможно ли вложить tibble, переданный в rlang ::dots_list?

#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]>