r - parallel::mclapply() 添加或删除到全局环境的绑定。哪个?
问题描述
为什么这很重要
对于drake
,我希望用户能够mclapply()
在锁定的全局环境中执行调用。为了重现性,环境被锁定。如果没有锁定,数据分析管道可能会使自己失效。
mclapply()
添加或删除全局绑定的证据
set.seed(0)
a <- 1
# Works as expected.
rnorm(1)
#> [1] 1.262954
tmp <- parallel::mclapply(1:2, identity, mc.cores = 2)
# No new bindings allowed.
lockEnvironment(globalenv())
# With a locked environment
a <- 2 # Existing bindings are not locked.
b <- 2 # As expected, we cannot create new bindings.
#> Error in eval(expr, envir, enclos): cannot add bindings to a locked environment
tmp <- parallel::mclapply(1:2, identity, mc.cores = 2) # Unexpected error.
#> Warning in parallel::mclapply(1:2, identity, mc.cores = 2): all scheduled
#> cores encountered errors in user code
由reprex 包(v0.2.1)于 2019 年 1 月 16 日创建
编辑
对于最初的激励问题,请参阅https://github.com/ropensci/drake/issues/675和https://ropenscilabs.github.io/drake-manual/hpc.html#parallel-computing-within-targets。
解决方案
我想parallel:::mc.set.stream()
有答案。显然,默认情况下mclapply()
会尝试.Random.seed
从全局环境中删除。由于默认的 RNG 算法是 Mersenne Twister,我们深入到下面的else
块中。
> parallel:::mc.set.stream
function ()
{
if (RNGkind()[1L] == "L'Ecuyer-CMRG") {
assign(".Random.seed", get("LEcuyer.seed", envir = RNGenv),
envir = .GlobalEnv)
}
else {
if (exists(".Random.seed", envir = .GlobalEnv, inherits = FALSE))
rm(".Random.seed", envir = .GlobalEnv, inherits = FALSE)
}
}
<bytecode: 0x4709808>
<environment: namespace:parallel>
我们可以mc.set.seed = FALSE
用来使以下代码工作,但这在实践中可能不是一个好主意。
set.seed(0)
lockEnvironment(globalenv())
parallel::mclapply(1:2, identity, mc.cores = 2, mc.set.seed = FALSE)
我想知道是否有一种方法可以锁定环境,同时仍然允许我们删除.Random.seed
.
推荐阅读
- excel - 无法从工作表调用函数
- c++ - 为什么有些词会出现分词错误?虽然其他人似乎工作正常
- angular - 如何将 Angular 6+ 服务变量注入 app-routing.module.spec.ts 并测试路由器重定向
- centos - 如何使用 IPTables 将流量重新路由到本地连接管理器或主 xmpp 服务 (Openfire)
- cartopy - 为什么检查地理点是否在土地上失败?
- reactjs - 使用 Axios - 我需要设置请求有效负载而不是表单数据 - 当我设置 Content Type = 'application/x-www-form-urlencoded'
- sql-server - sqlcmd 连接
- javascript - JavaScript - 清除 HTML 隐藏部分中复选框的值
- asp.net-core - 在 Asp.net Core MVC 中托管 Web 应用程序
- elixir - 通过关联查询