我想编写一个通用的weighted_summarise()函数,它将自动解析和转换用户调用的函数调用:

data %>% weighted_summarise(weights, a = sum(b), c = mean(d))

变成一个实际的呼叫,代表dplyr::summarise

data %>% dplyr::summarise(a = sum(weights * b), c = mean(weights * d))

这里,ac是要在简化数据内创建的新列,bdweightsdata中的现有列.

理想情况下,我希望我的函数完全像"本机"dplyr::summarise一样调用,但有一个额外的weights参数撒在每个聚合函数中.

weighted_summarise <- function(data, weights, ...) {
   data %>% dplyr::summarise(
       # how to manipulate the ... and inject the weights in each name-value pair?
   )
}

Question我如何操作省略号,以便将weights注入每个名称-值对的适当位置?我想以某种方式捕获AST,对其进行遍历并系统地操作.

推荐答案

这里有一个选项,通过将多个表达式转换为单个字符串并对其进行解析来将"权重"插值到...中传递的表达式中

weighted_summarise <- function(数据, weights, ...) {
      weights <- rlang::as_string(rlang::ensym(weights))
     
     v1 <- purrr::map_chr(rlang::enexprs(...), 
   ~ stringr::str_replace(rlang::as_label(.x), "\\(",
     function(x) stringr::str_c("(", weights, "*")))
   eval(rlang::parse_expr(stringr::str_c("数据 %>% 
      summarise(", stringr::str_c(names(v1), v1, sep = "=", 
          collapse = ", "), ")")))
   
       }

-测试

> 数据 %>%
     weighted_summarise(weights, a = sum(b), c = mean(d))
# A tibble: 1 × 2
      a     c
  <dbl> <dbl>
1 -2.95  1.13

# testing with the original summarise code outside the function
> 数据 %>% 
    dplyr::summarise(a = sum(weights * b), c = mean(weights * d))
# A tibble: 1 × 2
      a     c
  <dbl> <dbl>
1 -2.95  1.13

数据

数据 <- structure(list(b = c(-0.545880758366027, 0.536585304107612, 0.419623148618683, 
-0.583627199210279, 0.847460017311944, 0.266021979364892, 0.444585270360416, 
-0.466495123565759, -0.848370043948898, 0.00231194241576697), 
    d = c(-1.31690812429962, 0.598269112694685, -0.7622143703459, 
    -1.42909030324076, 0.332244449013422, -0.469060687608488, 
    -0.334986793584065, 1.53625215550584, 0.609994533253692, 
    0.51633569843567), weights = 1:10), class = c("tbl_df", "tbl", 
"数据.frame"), row.names = c(NA, -10L))

R相关问答推荐

将带有范围的字符串转换为R中的数字载体

从R中的另一个包扩展S3类的正确方法是什么

从嵌套列表中智能提取线性模型系数

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

整数成随机顺序与约束R?

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

如何将旋转后的NetCDF转换回正常的纬度/经度网格,并使用R?

提取具有连续零值的行,如果它们前面有R中的有效值

使用across,starts_with和ifelse语句变更多个变量

根据文本字符串中的值粘贴新列

plotly hover文本/工具提示在shiny 中不起作用

在R函数中使用加号

按时间顺序对不同事件进行分组

按列中显示的配对组估算NA值

解析嵌套程度极高的地理数据

创建在文本字符串中发现两个不同关键字的实例的数据框

为什么函数toTitleCase不能处理english(1),而toupper可以?

R:使用ApexCharge更改标签在饼图中的位置

将R中对象的CSV数组转换为JSON数组

从字符串列中的向量中查找第一个匹配的单词