如何使用带省略号(点)的 parse_exprs

How to use parse_exprs with ellipsis(dots)

传递多个参数不起作用
尝试使用 3dots ... 和 !!! 3刘海。但错误。

library(tidyverse)
library(rlang) 
tf1= data.frame(y=c('price'), grp= c('stock'),x=c('time') 
,stringsAsFactors = FALSE)    > 
dat= data.frame(price=c(20,12,24,34,12,34,56,88),               
stock=c('fb','fb','fb','fb','ms','ms','ms','ms'),time=c(2,4,6,8,2,4,6,8))
my_fun2 <- function(.x, .num_var, ...){
   group_var <- parse_exprs(...)
   print (group_var)
   num_var <- parse_expr(.num_var)

   x %>%
    group_by(!!!group_var) %>%
     mutate(avg = mean(!!num_var), n = n(), 
            sd = sd(!!num_var), se = sd/sqrt(n)) %>%
     distinct(!!!group_var, .keep_all = TRUE)  }
 my_fun2(dat, tf1$y, tf1$grp,tf1$x)

Error in parse_exprs(...) : unused argument (tf1$x)

如下

 library(tidyverse)
 library(rlang)


 tf1= data.frame(y=c('price'), grp= c('stock'),x=c('time') ,stringsAsFactors = FALSE)

 dat= data.frame(price=c(20,12,24,34,12,34,56,88), 
                 stock=c('fb','fb','fb','fb','ms','ms','ms','ms'),time=c(2,4,6,8,2,4,6,8))
 my_fun2 <- function(.x, .num_var, ...){
   group_var <- parse_exprs(...)
   print (group_var)
   num_var <- parse_expr(.num_var)

   x %>%
     group_by(!!!group_var) %>%
     mutate(avg = mean(!!num_var), n = n(), 
            sd = sd(!!num_var), se = sd/sqrt(n)) %>%
     distinct(!!!group_var, .keep_all = TRUE)

 }

 my_fun2(dat, tf1$y, tf1$grp,tf1$x)

实际出来的是分组汇总统计。

Error in parse_exprs(...) : unused argument (tf1$x)

由于传递的值是字符串,我们可以使用 group_by_at 更轻松地完成此操作。此外,确保字符串转换为符号 (sym) 并在 meansd

中计算 (!!)
my_fun2 <- function(.x, num_var, ...){
      group_var <-  c(...)        

       .x %>%
         group_by_at(vars(group_var)) %>%

         mutate(avg = mean(!! rlang::sym(num_var)), n = n(), 
                     sd = sd(!! rlang::sym(num_var)), se = sd/sqrt(n)) %>%
                      distinct_at(vars(group_var), .keep_all = TRUE)
         }
my_fun2(dat, tf1$y, tf1$grp, tf1$x)
# A tibble: 8 x 7
# Groups:   stock, time [8]
#  price stock  time   avg     n    sd    se
#  <dbl> <fct> <dbl> <dbl> <int> <dbl> <dbl>
#1    20 fb        2    20     1    NA    NA
#2    12 fb        4    12     1    NA    NA
#3    24 fb        6    24     1    NA    NA
#4    34 fb        8    34     1    NA    NA
#5    12 ms        2    12     1    NA    NA
#6    34 ms        4    34     1    NA    NA
#7    56 ms        6    56     1    NA    NA
#8    88 ms        8    88     1    NA    NA

sdseNA 因为每组只有一个观察值