gpt4 book ai didi

r - 使用带有 furrr 的 tidy 评估

转载 作者:行者123 更新时间:2023-12-05 08:49:29 25 4
gpt4 key购买 nike

我想使用 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 提供名称,但似乎都不起作用。有什么办法可以使这项工作?我的实际功能要复杂得多,但我认为原理是一样的。如果有人可以提供帮助,那就太好了!

最佳答案

future 尝试自动确定您在代码中使用的全局变量。由于整洁的评估,它识别了 ab 但没有找到。您可以使用 future_options(globals = FALSE) 禁用此设置。

future::plan(future::multiprocess)

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_parallel <- function(data, var1, var2){
furrr::future_map_dfr(.x = data,
.f = ~ .x %>%
dplyr::mutate(product = {{var1}} * {{var2}}),
.options = furrr::future_options(globals = FALSE)
)
}

multiplier_parallel(input, a, b)
# A tibble: 4 x 3
a b product
<dbl> <dbl> <dbl>
1 1 2 2
2 2 2 4
3 1 4 4
4 2 4 8

关于r - 使用带有 furrr 的 tidy 评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64006043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com