0

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

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)
4

1 回答 1

3

通常,省略号 (...) 可用于将未知数量的命名和未命名参数传递给函数。 有关示例,请参见 此处。

但是传递裸变量有不同的结构,比如 Tidyverse 中经常使用的那些。当它们的数量未知时,它会变得稍微复杂一些。更多信息,请从这里开始:

tidyeval 链接是此代码、讨论报价和其中几个功能的良好基础。

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
于 2019-11-16T03:42:39.913 回答