【问题标题】:Is it possible to nest a tibble passed to rlang::dots_list?是否可以嵌套传递给 rlang::dots_list 的 tibble?
【发布时间】:2020-10-23 16:16:28
【问题描述】:

我有一个 2x2 小标题 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 &lt;- 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(...)
  )
}

【问题讨论】:

  • 如果你只是这样使用tibbletibble(parameter = '1', x_name = list(x))?它返回的正是你所期望的。基本上,f 将是函数tibble。你只需要将x 设置到它自己的列表中。

标签: r rlang


【解决方案1】:

添加到@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]>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2018-04-17
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多