我正在尝试创建一个工作流计划,该计划将为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
问题。
答案 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
期望命令作为字符串,因此最终表达式需要转换为字符串。
我们首先使用drake
将A
,B
和C
捕获为符号,然后使用您已有的代码计算所有可能的成对组合:
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。