0

我正在尝试使用多会话并行性运行 R 代码,以便所有错误消息都重定向到同一个文件。但是,sink()无法创建。

library(parallel)
cl <- makePSOCKcluster(2)
f <- function(){
  withr::with_message_sink("messages.txt", Sys.sleep(10))
}
clusterCall(cl = cl, fun = f)

## Error in checkForRemoteErrors(lapply(cl, recvResult)) :
##   2 nodes produced errors; first error: Cannot establish message sink when another sink is active.
## Calls: clusterCall -> checkForRemoteErrors
## Execution halted

编辑

鉴于一些回应,我应该详细说明这篇文章的目的。我正在开发drake,一个具有多个并行后端的 R 包。今天,我实现了一个新的hook参数make()它只是将单个并行作业包装在用户选择的函数中。我真正在寻找的是一种hook不管并行后端如何都能使控制台静音的方法。当前开发版本中的后端包括

  • parallel::mclapply()
  • parallel::parLapply()
  • base::lapply()(通过parLapply()一份工作)
  • make -j用适当的Makefile
  • future::sequential
  • future::multicore
  • future::multisession
  • future.batchtools此处列出的后端

我以为我找到了一个hook适用于标准错误的方法。

hook <- function(){
  withr::with_message_sink("messages.txt", Sys.sleep(10))
}

但是,withr::with_message_sink()不允许我将多个工作人员下沉到相同的文件parLapply()future::multisession后端。

4

1 回答 1

1

你可以只使用水槽吗?:

library(parallel)
cl <- makePSOCKcluster(2)
clusterApply(cl, seq_along(cl), function(i) workerID <<- i)


f <- function(){
  outtxt <- paste(workerID, "messages.txt", sep="_")
  print(outtxt)
  sink(outtxt)
  Sys.sleep(10)
  sink()
}
clusterCall(cl = cl, fun = f)

stopCluster(cl)
于 2017-10-26T20:43:52.857 回答