在自定义函数 dplyr mutate and paste 中动态命名新变量/列

dynamicaly name a new variable / column within a custom function dplyr mutate and paste

我想稍微简化我的代码,并尝试参与自定义构建函数的世界。我构建了以下虚拟对象:

library(dplyr, tidyverse)
##
string <- c("car", "train", 'bike', 'plain')
speed1 <- runif(4, min = 0, max = 10000)
speed2 <- runif(4, min = 0, max = 10000)
n1  <- sample(1:100, 4)
n2  <- sample(1:100, 4)
##
df <- data.frame(string, speed1, speed2, n1, n2)
df

基本上,我想做以下类型的简单操作:

df <- df%>%
 dplyr::mutate(speed1_n1 = paste0(format(speed1, big.mark   = ",") , '\n(' , format(n1, big.mark   = ",") , ')'))
df

我可以构建一个函数:

my_fun <- function(dataf, V1, V2){
 dataf <- dataf%>%
dplyr::mutate(speed1_n1 = paste0(format(V1, big.mark   = ",") , '\n(' , format(V2, big.mark   = ",") , ')'))}

df<-df%>%my_fun( df$speed1, df$n1)
df

然而,变量名需要从被调用的变量名中动态生成,类似于问题here,但在一个函数内。我无法手动指定 mutate(speed1_n1=...。一些东西,例如:!!paste('speed1', 'n1', sep = "_"):=,但带有变量/列名称而不是引号。

我们可以使用不带引号的参数并使用 {{}} 进行评估

my_fun <- function(dataf, V1, V2){
   dataf %>%
   dplyr::mutate("{{V1}}_{{V2}}" := paste0(format({{V1}}, big.mark   = ",") ,
      '\n(' , format({{V2}}, big.mark   = ",") , ')'))
}

-测试

my_fun(df, speed1, n1)
string   speed1   speed2 n1 n2       speed1_n1
1    car 7886.962 3218.585 37 83 7,886.962\n(37)
2  train 9534.978 5524.649 98 34 9,534.978\n(98)
3   bike 6984.790 9476.838 60 55 6,984.790\n(60)
4  plain 6543.198 2638.609  9 53 6,543.198\n( 9)