我想使用furrr
包而不是purrr
包使以下函数并行运行。
library(furrr)
library(tidyverse)
input <- list(element1 = tibble::tibble(a = c(1, 2), b = c(2, 2)),
element2 = tibble::tibble(a = c(1, 2), b = c(4, 4))
)
multiplier <- function(data, var1, var2){
purrr::map_df(.x = data,
.f = ~ .x %>%
dplyr::mutate(product = {{var1}} * {{var2}})
)
}
multiplier(input, a, b)
但是,当我将其转换为furrr
等价物时,会出现错误。
multiplier_parallel <- function(data, var1, var2){
furrr::future_map_dfr(.x = data,
.f = ~ .x %>%
dplyr::mutate(product = {{var1}} * {{var2}})
)
}
future::plan(multiprocess)
multiplier_parallel(input, a, b)
Error in get(name, envir = env, inherits = FALSE) :
Identified global objects via static code inspection (structure(function (..., .x = ..1, .y = ..2, . =
..1); .x %>% dplyr::mutate(product = {; {; var1; }; } * {; {; var2; }; }), class =
c("rlang_lambda_function", "function"))). Object 'a' not found
我认为原因是该future
包会查找要导出给工作人员的所有必要变量。在这种情况下,它正在寻找列名“a”作为全局变量,但找不到它,因此出现错误。
当我只是将变量名插入到调用中时,它可以工作,但是现在该函数不再适用于任何变量名:
multiplier_parallel <- function(data, var1, var2){
furrr::future_map_dfr(.x = data,
.f = ~ .x %>%
dplyr::mutate(product = a * b)
)
}
multiplier_parallel(input, a, b)
到目前为止,我尝试了几件事,包括为 .future_options 提供名称,但似乎都没有。有什么办法可以使这项工作?我的实际功能要复杂得多,但我认为主体是相同的。如果有人可以提供帮助,那就太好了!