在 glue::glue 调用中使用函数的未命名参数...

Use a function's unnamed parameters ... in a glue::glue call

我想要一个函数将两个字符变量粘合在一起,即使在调用函数之前不知道一个(或多个)变量的名称。

f <- function(t, str1, ...) {
  t %>% 
    mutate(name = glue::glue("{str1} {...}"))
}
s <- tidyr::tribble(
                    ~str1, ~str2,
                    "first", "second"
                    )
s
s %>% f(str1, str2)

我想要的答案与此函数的结果相同,并且我假设第二个字段的名称已知。

f2 <- function(t, str1, ...) {
  t %>% 
    mutate(name = glue::glue("{str1} {str2}"))
}
s <- tidyr::tribble(
                    ~str1, ~str2,
                    "first", "second"
                    )
s
s %>% f2(str1, str2)

一般情况下,省略号 (...) 可用于传递未知数量的命名 和函数的未命名参数。看 here 举个例子。

但是像那些传递裸变量有不同的结构 在 Tidyverse 中经常使用。当 他们的数量不详。更多信息,从这里开始:

tidyeval link 是这段代码的良好基础,讨论了引用,以及其中的几个函数。

library(tidyverse)
df <- tibble(
  a = LETTERS[1:10],
  b = letters[11:20]
)

mixed_bare_glue <- function(.df, .x, ...) {
  var_x <- enquo(.x)
  selected_vars <- enquos(...)
  full_sel_vars <- c(var_x, selected_vars)

  var_expr <- purrr::map(full_sel_vars, as_label) %>%
    purrr::map(~ paste0("{", .x, "}")) %>%
    purrr::reduce(paste)
  .df %>%
    mutate(name = glue::glue(var_expr))
}

mixed_bare_glue(df, a, b)
#> # A tibble: 10 x 3
#>    a     b     name  
#>    <chr> <chr> <glue>
#>  1 A     k     A k   
#>  2 B     l     B l   
#>  3 C     m     C m   
#>  4 D     n     D n   
#>  5 E     o     E o   
#>  6 F     p     F p   
#>  7 G     q     G q   
#>  8 H     r     H r   
#>  9 I     s     I s   
#> 10 J     t     J t