当sink()用于捕获foreach循环中的消息时,如何避免"sink stack is full"错误

Rog*_*ger 4 foreach r cat sink

为了看到由foreach()循环中运行的函数输出的控制台消息,我遵循了这个人的建议,并添加了sink()这样的调用:

   library(foreach)    
   library(doMC)
   cores <- detectCores()
   registerDoMC(cores)

   X <- foreach(i=1:100) %dopar%{
   sink("./out/log.branchpies.txt", append=TRUE)
   cat(paste("\n","Starting iteration",i,"\n"), append=TRUE)
   myFunction(data, argument1="foo", argument2="bar")
   }
Run Code Online (Sandbox Code Playgroud)

然而,在迭代77我得到错误'sink stack is full'.关于在使用for循环时避免此错误的问题有很多,但不是foreach.将其他隐藏的foreach输出写入文件的最佳方法是什么?

Rol*_*and 6

这在我的Mac上运行没有错误:

library(foreach)    
library(doMC)
cores <- detectCores()
registerDoMC(cores)

X <- foreach(i=1:100) %dopar%{
  sink("log.branchpies.txt", append=TRUE)
  cat(paste("\n","Starting iteration",i,"\n"))
  sink() #end diversion of output
  rnorm(i*1e4)
}
Run Code Online (Sandbox Code Playgroud)

这个更好:

library(foreach)    
library(doMC)
cores <- detectCores()
registerDoMC(cores)
sink("log.branchpies.txt", append=TRUE)
X <- foreach(i=1:100) %dopar%{
  cat(paste("\n","Starting iteration",i,"\n"))
    rnorm(i*1e4)
}
sink() #end diversion of output
Run Code Online (Sandbox Code Playgroud)

这也有效:

library(foreach)    
library(doMC)
cores <- detectCores()
registerDoMC(cores)

X <- foreach(i=1:100) %dopar%{
  cat(paste("\n","Starting iteration",i,"\n"), 
       file="log.branchpies.txt", append=TRUE)
  rnorm(i*1e4)
}
Run Code Online (Sandbox Code Playgroud)