问题
In order to see the console messages output by a function running in a foreach()
loop I followed the advice of this guy and added a sink()
call like so:
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")
}
However, at iteration 77 I got the error 'sink stack is full'. There are well-answered questions about avoiding this error when using for-loops, but not foreach. What's the best way to write the otherwise-hidden foreach output to a file?
回答1:
This runs without errors on my 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)
}
This is better:
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
This works too:
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)
}
回答2:
As suggested by this guy , it is quite tricky to keep track of the sink stack. It is, therefore advised to use ability of cat
to write to file, such as suggested in the answer above:
cat(..., file="log.txt", append=TRUE)
To save some typing you could create a wrapper function that diverts output to file every time cat
is called:
catf <- function(..., file="log.txt", append=TRUE){
cat(..., file=file, append=append)
}
So that at the end, when you call foreach
you would use something like this:
library(foreach)
library(doMC)
cores <- detectCores()
registerDoMC(cores)
X <- foreach(i=1:100) %dopar%{
catf(paste("\n","Starting iteration",i,"\n"))
rnorm(i*1e4)
}
Hope it helps!
回答3:
Call sink() with no arguments once inside the for loop to reset it to end the file writing at the end of each iteration and you will not get this error again.
来源:https://stackoverflow.com/questions/26296288/how-to-avoid-sink-stack-is-full-error-when-sink-is-used-to-capture-messages