我在包中定义了一个函数template <typename F>
MemoizedFunctor(F)
-> MemoizedFunctor<F,
decltype(getOut(std::declval<F>())),
typename decltype(getIn(std::declval<F>()))::type>;
,该包将数据和R表达式作为输入,然后将用户定义的表达式应用于数据。这是该函数的用法示例:
f
使用显式期货和用户定义的对象的此函数的并行版本会出现问题。这里是玩具版本:
f <- function(data, expr) {
expr <- substitute(expr)
eval(expr, envir = data)
}
data <- data.frame(a = 1:2, b = 3:4)
f(data, mean(a))
#> [1] 1.5
问题在于library(future)
f <- function(data, expr) {
expr <- substitute(expr)
y <- future::future(eval(expr, envir = data))
future::value(y)
}
data <- data.frame(a = 1:2, b = 3:4)
myfun <- function(x){sum(sqrt(x))}
plan(sequential)
f(data, myfun(a))
#> [1] 2.414214
plan(multiprocess)
f(data, myfun(a))
#> Error in myfun(a) : impossible to find function "myfun"
无法轻易找到myfun
,因此必须手动将其导出。我可以通过使用future
分析expr
并手动添加对象来解决此问题:
future::getGlobalsAndPackages
我想知道是否有更好/更好的方法来做到这一点,因为这对我来说似乎是个黑客。
答案 0 :(得分:0)
我终于发现plan
中的省略号传播到future
plan(multiprocess, globals = myfun)