为Drake中的所有输入组合生成工作流程计划吗?

时间:2018-08-16 22:29:18

标签: r rlang drake-r-package

我正在尝试创建一个工作流计划,该计划将为my_function(x, y)中的所有输入组合运行某个功能my_dataset,但是对于如何在不使用粘贴的情况下为drake的工作流生成命令感到困惑。

考虑:

library(drake)
library(dplyr)

A <- 'apple'
B <- 'banana'
C <- 'carrot'

my_function <- function(x, y)
    paste(x, y, sep='|IT WORKS|')

my_function(A, B)

combos <- combn(c('A', 'B', 'C'), 2) %>% 
    t() %>% 
    as_data_frame()

targets <- apply(combos, 1, paste, collapse = '_')

commands <- paste0('my_function(', apply(combos, 1, paste, collapse = ', '), ')') 

my_plan <- data_frame(target = targets, command = commands)
make(my_plan)

输出:

> my_plan
# A tibble: 3 x 2
  target command          
  <chr>  <chr>            
1 A_B    my_function(A, B)
2 A_C    my_function(A, C)
3 B_C    my_function(B, C)

上面的代码有效,但是我正在使用paste0生成函数调用。我认为这不是最佳选择,而且扩展性很差。有没有更好的方法来生成这些计划?这可能不是一个棘手的问题,而是一个更多的rlang问题。

2 个答案:

答案 0 :(得分:2)

免责声明:此答案说明如何使用 func handler(ctx context.Context, sqsEvent events.SQSEvent) error { for _, message := range sqsEvent.Records { fmt.Println("Id", message.MessageId) fmt.Println("Source", message.EventSource) fmt.Println("Body", message.Body) } return error.New("Song by B.S.") } 框架编写表达式。但是,rlang期望命令作为字符串,因此最终表达式需要转换为字符串。

我们首先使用drakeABC捕获为符号,然后使用您已有的代码计算所有可能的成对组合:

quote

我们现在可以使用CB <- combn( list(quote(A), quote(B), quote(C)), 2 ) %>% t() %>% as_data_frame() # # A tibble: 3 x 2 # V1 V2 # <list> <list> # 1 <symbol> <symbol> # 2 <symbol> <symbol> # 3 <symbol> <symbol> 来并行地并行遍历两列并组成我们的表达式:

purrr::map2

如上所述,CMDs <- purrr::map2( CB$V1, CB$V2, ~rlang::expr( my_function((!!.x), (!!.y)) ) ) # [[1]] # my_function(A, B) # [[2]] # my_function(A, C) # [[3]] # my_function(B, C) 需要使用字符串,因此我们必须将表达式转换为以下表达式:

drake

您其余的代码应该像以前一样工作。

最终,由您决定表达式算术还是字符串算术对您的应用程序更有效/更具可读性。还需要提及的另一件事是commands <- purrr::map_chr( CMDs, rlang::quo_name ) # [1] "my_function(A, B)" "my_function(A, C)" "my_function(B, C)" 软件包,它可以使字符串算法的执行更轻松。

答案 1 :(得分:1)

编辑

drake现在具有执行此操作的map_plan()函数。

原始帖子

对不起,我对此话题迟到了。几个月前,我在手册中的custom metaprogramming的手册中添加了一个部分,以涵盖您提出的情况。在该示例中,有一个使用rlang / tidyeval的解决方案,以及一个等效的使用as.call()创建函数调用的解决方案。

现在我想到了,这个用例已经足够通用了,我认为应该有一个简单的map_plan()函数来为您构建计划。我会努力的。

顺便说一句,您计划中的command列可以是语言对象的列表列,而不是字符向量,但是您需要一个字符列才能使用wildcard templating