如何避免';水槽堆叠已满';使用sink()捕获foreach循环中的消息时出错

如何避免';水槽堆叠已满';使用sink()捕获foreach循环中的消息时出错,r,foreach,cat,sink,R,Foreach,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(

为了查看在
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")
   }
库(foreach)
图书馆(doMC)

cores这在我的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)
}
库(foreach)
图书馆(doMC)
cores正如所建议的,跟踪汇堆栈是相当困难的。因此,建议使用
cat
写入文件的功能,如上面的回答中所建议的:

cat(..., file="log.txt", append=TRUE)
要保存一些输入,可以创建一个包装器函数,每次调用
cat
时将输出转移到文件:

catf <- function(..., file="log.txt", append=TRUE){
  cat(..., file=file, append=append)
}

希望有帮助

在for循环中调用sink()(不带任何参数),将其重置为在每次迭代结束时结束文件写入,您将不会再次遇到此错误

你真的在并行运行吗?为什么要对文件使用
sink
cat
?我使用
foreach
对列表中的100个元素并行运行相同的计算密集型函数,因为使用
for
循环,甚至
mclappy
(我已经尝试过了,速度要慢得多)。我使用的是
sink
cat
,因为链接页面建议我这样做,并且因为它有助于跟踪
foreach
循环执行的迭代。您没有回答问题。您不会显示如何设置集群。此外,如果正确设置集群,您链接到的教程不使用
cat
mclappy
file
参数,其速度不应比
foreach
慢。抱歉,我实际上没有在
cat
中使用file参数-这是我正在尝试的。我打错了密码。我现在就修。谢谢。我的原始代码的问题一定是它没有包含sink()来结束输出的转移。我怀疑这对我来说不起作用,因为每个工作人员都是事先脱离循环的,所以这可能取决于循环到达它。
cat(..., file="log.txt", append=TRUE)
catf <- function(..., file="log.txt", append=TRUE){
  cat(..., file=file, append=append)
}
library(foreach)    
library(doMC)
cores <- detectCores()
registerDoMC(cores)

X <- foreach(i=1:100) %dopar%{
  catf(paste("\n","Starting iteration",i,"\n"))
  rnorm(i*1e4)
}