相关疑难解决方法(0)

"取消注册"一个doParallel集群

如果我在foreach... %dopar%没有注册集群的情况下运行,foreach会发出警告,并按顺序执行代码:

library("doParallel")
foreach(i=1:3) %dopar%
  sqrt(i)
Run Code Online (Sandbox Code Playgroud)

产量:

Warning message:
executing %dopar% sequentially: no parallel backend registered 
Run Code Online (Sandbox Code Playgroud)

但是,如果我在启动,注册和停止集群后运行相同的代码,则会失败:

cl <- makeCluster(2)
registerDoParallel(cl)
stopCluster(cl)
rm(cl)
foreach(i=1:3) %dopar%
  sqrt(i)
Run Code Online (Sandbox Code Playgroud)

产量:

Error in summary.connection(connection) : invalid connection
Run Code Online (Sandbox Code Playgroud)

有没有相反的registerDoParallel()清理群集注册?还是我坚持使用旧集群的鬼魂,直到我重新开始我的R会话?

/编辑:一些谷歌搜索揭示bumphunter:::foreachCleanup()bumphunter Biocondoctor包中的功能:

function () 
{
    if (exists(".revoDoParCluster", where = doParallel:::.options)) {
        if (!is.null(doParallel:::.options$.revoDoParCluster)) 
            stopCluster(doParallel:::.options$.revoDoParCluster)
        remove(".revoDoParCluster", envir = doParallel:::.options)
    }
}
<environment: namespace:bumphunter>
Run Code Online (Sandbox Code Playgroud)

但是,此功能似乎无法解决问题.

library(bumphunter)
cl <- makeCluster(2)
registerDoParallel(cl)
stopCluster(cl)
rm(cl)
bumphunter:::foreachCleanup()
foreach(i=1:3) %dopar%
  sqrt(i)
Run Code Online (Sandbox Code Playgroud)

foreach在哪里保留注册集群的信息?

parallel-processing r parallel-foreach

34
推荐指数
1
解决办法
3万
查看次数

覆盖在命名空间中导入的函数

由于termplotR中的函数包含一些令我烦恼的错误的奇怪代码,我想在我自己的测试代码中覆盖它,直到我找到一个更永久的解决方案.问题是mgcv包没有加载更改的功能.该mgcvimportFrom()在NAMESPACE文件中使用其名称空间中的stats包加载termplot .

我怎样才能说服mgcv使用改变的termplot?我试过了 :

unlockBinding("termplot", as.environment("package:stats"))
assign("termplot", my.termplot, as.environment("package:stats"))
lockBinding("termplot", as.environment("package:stats"))
Run Code Online (Sandbox Code Playgroud)

当应用于lm-objects时,这个工作并且使用改变的termplot.但是当使用mgcv包生成的gam-object时,这不起作用.如果我可以避免它,我真的不会从源代码构建stats包...

为了澄清,我也试过了

assignInNamespace("termplot", my.termplot, ns="stats")
assignInNamespace("termplot", my.termplot, ns="mgcv")
Run Code Online (Sandbox Code Playgroud)

在所有可能的组合中,在附加mgcv之后,在附加mgcv之后,我没有设法让它工作.


编辑:

我尝试了这里给出的所有选项(除了重建任何一个包),并且无法让它工作.对我来说简单的方法是使用包装函数.这个讨论可以在这里找到.感谢所有的提示.


一个可重复的例子:

my.termplot <- function (x) print("my new termplot")

  unlockBinding("termplot", as.environment("package:stats"))
  assignInNamespace("termplot", my.termplot, ns="stats", envir=as.environment("package:stats"))
  assign("termplot", my.termplot, as.environment("package:stats"))
  lockBinding("termplot", as.environment("package:stats"))


y <- 1:10
x <- 1:10
xx <- lm(y~x)
termplot(xx)
require(mgcv)
dat <- gamSim(1, n = 400, dist = "normal", scale = 2)
b <- gam(y ~ s(x0) + …
Run Code Online (Sandbox Code Playgroud)

namespaces r function package

28
推荐指数
1
解决办法
8246
查看次数

foreach、doParallel 和随机生成

考虑使用并行foreach生成随机值的非常基本(且效率低下)的代码:

cl <- makeCluster(2)
registerDoParallel(cl)
foreach(i = 1:100) %dopar% rnorm(1)
Run Code Online (Sandbox Code Playgroud)

它是正确的还是随机生成正常工作需要任何额外的步骤?我想这已经足够了,快速检查似乎“证明”了种子工作正常,但我想确定它在其他平台上也是如此,因为我希望代码是可移植的。

parallel-processing r parallel-foreach doparallel

2
推荐指数
1
解决办法
628
查看次数