我正在尝试使用多会话并行运行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
argument到make()
,wraps individual parallel jobs只有function of the user's choice。我真正想要的是hook
,无论并行后端如何,它都会使控制台静音。当前开发版本中的后端包括
parallel::mclapply()
parallel::parLapply()
base::lapply()
(通过parLapply()
获得一份工作)make -j
使用正确的Makefile
future::sequential
future::multicore
future::multisession
future.batchtools
backends listed here 我以为我找到了一个适用于stderr的hook
。
hook <- function(){
withr::with_message_sink("messages.txt", Sys.sleep(10))
}
但是,withr::with_message_sink()
不允许我将多个工作人员归入parLapply()
或future::multisession
后端的同一文件中。
答案 0 :(得分: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)