我如何紧凑地将多个符号参数传递给函数?

how do i compactly pass multiple symbol arguments into a function?

我创建了一个虚拟数据框 (df),并希望为数据框中每次出现的 'col_x' 派生一个新列。

我创建了一个执行此操作的函数,尽管它需要输入每个列的名称 derived/derived 来自,如示例 1 所示。

如果我有大量的列,这看起来会很乱。我想做一些类似于示例 2 的事情,我可以将一个向量(示例中的 arg)传递给函数。

示例 2 实际上不起作用,因为我在向量中使用了字符串。我想我可能需要一个符号向量?不过我不确定这是否可行。

df <- data.frame(numbers = rep(5, 10), col_1 = sample(1:10, 10), col_2 = sample(1:10, 10), col_3 = sample(1:10, 10))


my_fun <- function(...){
  
  captured_expressions <- enexprs(...)
  
  len <- length(captured_expressions) / 2

  for(x in 1:len){
    y <- x + 3
    df <- df %>% mutate(!!captured_expressions[[y]] := !!captured_expressions[[x]] + numbers)
  }

print(df)
  
}

# example 1:
my_fun(col_1, col_2, col_3, col_1_derived, col_2_derived, col_3_derived)

arg <- append(paste0('col_', 1:3),
         paste0('col_', 1:3, '_derived'))

# example 2:
my_fun(arg)

这是否回答了您的问题?

plouf <- paste(paste0('col_', 1:3,collapse = ","),
               paste0('col_', 1:3, '_derived',collapse = ","),
               collapse = ",")

# example 2:
my_fun(eval(parse(text = "plouf")))

我创建了一个字符串作为你函数的参数求值

我已经使用一个我不知道的名为 as.symbol 的函数解决了这个问题。

my_fun <- function(...){

  len <- length(...) / 2
  
  for(x in 1:len){
    y <- x + 3
    df <- df %>% mutate(!!as.symbol(...[y]) := !!as.symbol(...[x]) + numbers)
  }
  
  print(df)

}