是否可以嵌套传递给 rlang::dots_list 的 tibble?

Is it possible to nest a tibble passed to rlang::dots_list?

我有一个 2x2 tibble x,我想发送给函数 f。我在 f 中使用 rlang::dots_list() 来提取所有发送到 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(...)
  )
}

添加到@Edo 的评论中,您可以使用 purrr::map_if 实现他的解决方案并检查对象是否为 data.frame,然后是否应用列表:

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