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

如何使用带省略号(点)的parse_exprs,r,rlang,R,Rlang,传递多个参数无效 试过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','

传递多个参数无效
试过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)
库(tidyverse)
图书馆(rlang)
tf1=data.frame(y=c('price')、grp=c('stock')、x=c('time'))
,stringsAsFactors=FALSE)>
dat=数据帧(价格=c(20,12,24,34,12,34,56,88),
股票=c('fb','fb','fb','fb','ms','ms','ms','ms'),时间=c(2,4,6,8,2,4,6,8))
我的妈妈2%
不同(!!!组变量,.keep\u all=TRUE)}
my_fun2(数据,tf1$y,tf1$grp,tf1$x)
解析表达式(…)中出错:未使用的参数(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)
库(tidyverse)
图书馆(rlang)
tf1=data.frame(y=c('price')、grp=c('stock')、x=c('time')、stringsAsFactors=FALSE)
dat=数据帧(价格=c(20,12,24,34,12,34,56,88),
股票=c('fb','fb','fb','fb','ms','ms','ms','ms'),时间=c(2,4,6,8,2,4,6,8))
我的妈妈2%
不同(!!!组变量,.keep\u all=TRUE)
}
my_fun2(数据,tf1$y,tf1$grp,tf1$x)
实际输出是按组进行的汇总统计

解析表达式(…)中出错:未使用的参数(tf1$x)


由于传递的值是字符串,因此我们可以使用
group\u by\u at
更轻松地执行此操作。另外,确保字符串转换为符号(
sym
)并在
mean
sd
中计算(
!!

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
my_fun2%
变异(平均值=平均值(!!rlang::sym(num_var)),n=n(),
sd=sd(!!rlang::sym(num_var)),se=sd/sqrt(n))%>%
不同的(变量(组变量),.keep_all=TRUE)
}
my_fun2(数据,tf1$y,tf1$grp,tf1$x)
#一个tibble:8x7
#分组:股票、时间[8]
#股票时间平均价格
#        
#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

sd
se
NA
,因为每组只有一个观察值

因为传递的值是字符串,我们可以通过
group\u by\u at
更容易做到这一点。另外,确保字符串转换为符号(
sym
)并在
mean
sd
中计算(
!!

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
my_fun2%
变异(平均值=平均值(!!rlang::sym(num_var)),n=n(),
sd=sd(!!rlang::sym(num_var)),se=sd/sqrt(n))%>%
不同的(变量(组变量),.keep_all=TRUE)
}
my_fun2(数据,tf1$y,tf1$grp,tf1$x)
#一个tibble:8x7
#分组:股票、时间[8]
#股票时间平均价格
#        
#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

sd
se
NA
,因为每组只有一次观察

无错误。但同一代码只打印前3列。这是完整的代码吗?。我理解你关于“NA”的观点。@kamal是的,这是完整的代码。您是否也用
dplyr
加载了
plyr
。在这种情况下,您可能需要明确指定
dplyr::mutate
@kamal另外,我使用的
dplyr'0.8.3'
已经加载了tidyverseinstalling dplyr 0.8.3并删除了plyr。非常感谢您这么快的回复。欣赏我已经检查过了,没有错。但同一代码只打印前3列。这是完整的代码吗?。我理解你关于“NA”的观点。@kamal是的,这是完整的代码。您是否也用
dplyr
加载了
plyr
。在这种情况下,您可能需要明确指定
dplyr::mutate
@kamal另外,我使用的
dplyr'0.8.3'
已经加载了tidyverseinstalling dplyr 0.8.3并删除了plyr。非常感谢您这么快的回复。欣赏我已经查过了。