我有一段通用的代码,A,在一系列程序中反复出现.A的每一个实例都采用以下形式

output_data = input_data %>%
              do common operations %>%
              do specific dplyr methods that vary from instance to instance %>%
              do more common operations
              

由于对A的重复调用,将此代码包装在函数中是有意义的.为了处理特定于实例的dqr方法调用,我希望将dqr方法作为参数传递给函数.因此,我想知道你如何以简洁的方式将multiple个dither方法(每个方法都有任意数量的条件)传递到一个函数中.

将一个单一的dqr方法传递给一个具有任意数量参数的函数并不太难,

insert_dplyr_method = function(input_data, dplyr_method, ...) {

    output_data = input_data %>%
                  dplyr_method(...)

    return(output_data)

}

测试

dframe = data.frame(start = c(1,1,1,2,2,3,3,3,3), 
                    middle = sample(1:9), 
                    end = c(1,2,3,1,2,1,2,3,4))

dframe_1 = insert_dplyr_method(dframe, 
                               dplyr::filter, 
                               start == 1, 
                               end == 2)

dframe_2 = insert_dplyr_method(dframe, 
                               dplyr::select, 
                               all_of("start"))

我真正想做的是传入n个dplyr方法,每个方法都有任意数量的参数,即对于n=2的情况,类似于

insert_dplyr_method_2 = function(input_data, dplyr_method_1, ...1, dplyr_method_2, ...2) {

    output_data = input_data %>%
                  dplyr_method_1(..._1) %>%
                  dplyr_method_2(..._2)

    return(output_data)

}

我能想到的唯一方法是将dplyr方法及其对应的省略号传递到列表中的函数中,即

dplyr_methods = list(c(dplyr_method_1, ...), c(dplyr_method_2, ...), etc.)

然后使用do.call()方法(参见hereherehere),尽管我无法使其工作.

我想知道有没有人能教我怎么做?我也乐于接受更好的方法,如果有人知道的话.

推荐答案

1)而不是传递变化部分的函数和自变量,而是将已经填充了自变量的流水线传递给主函数do_all.下面我们使用您的示例,只是我们在末尾添加了一个不变的sum来说明它是如何工作的.请注意,. %>% whatever是用于定义函数的Magrittr语法,该函数将输入传递给任何对象.

library(dplyr)
set.seed(123)

do_all <- function(data, fun) data %>% fun %>% sum  # main function

dframe = data.frame(start = c(1,1,1,2,2,3,3,3,3), 
                    middle = sample(1:9), 
                    end = c(1,2,3,1,2,1,2,3,4))

fun <- . %>% filter(start == 1, end == 2) %>% select(start)
do_all(dframe, fun)
## [1] 1

fun <- . %>% filter(start == 1, end == 2) %>% select(end)
do_all(dframe, fun)
## [1] 2

2)交替地定义前处理流水线和后处理流水线,然后每次仅运行整个流水线.prepost是不变的部分.

pre <- . %>% identity
post <- . %>% sum

dframe %>% pre %>% filter(start == 1, end == 2) %>% select(start) %>% post
## [1] 1

dframe %>% pre %>% filter(start == 1, end == 2) %>% select(end) %>% post
## [1] 2

R相关问答推荐

为什么stat_bin在R中的ggplot中显示错误的数字?

有没有一种方法可以在子包上使用‘library()’中的‘exclub’参数?

在R中使用自定义函数时如何删除该函数的一部分?

如何创建构成多个独立列条目列表的收件箱框列?

使用R中的gt对R中的html rmarkdown文件进行条件格式设置表的单元格

ggplot geom_smooth()用于线性回归虚拟变量-没有回归线

如何删除gggvenn与gggplot绘制的空白?

ggplot的轴标签保存在officer中时被剪切

用相同方法得到不同函数的ROC最优截断值

在连续尺度上转置标签[瀑布图,R]

如何在R forestplot中为多条垂直线分配唯一的 colored颜色 ?

线性模型斜率在减少原始数据时提供NA

SHINY:使用JS函数应用的CSS样式显示HTML表格

从非重叠(非滚动)周期中的最新数据向后开窗并在周期内计数

仅在R中的数据集开始和结束时删除所有 Select 列的具有NA的行

根据约束随机填充向量的元素

R+reprex:在呈现R标记文件时创建可重现的示例

使用函数从R中的列中删除标高

如何使用grepl()在数据帧列表中 Select 特定字符串?

GOGPLATE geom_boxploy色彩疯狂