是否可以嵌套传递给 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]>
我有一个 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]>