我在 RStudio 中使用 mclapply 并希望从每个进程向控制台输出一个输出,但这似乎以某种方式被抑制(例如这里提到的:Is mclapply 保证按顺序返回其结果?)。我怎样才能让 R Studio 打印类似的东西
x <- mclapply(1:20, function(i) cat(i, "\n"))
到控制台?
我尝试过 print()、cat()、write(),但它们似乎都不起作用。我还尝试mc.silent = FALSE
显式设置而没有效果。
我在 RStudio 中使用 mclapply 并希望从每个进程向控制台输出一个输出,但这似乎以某种方式被抑制(例如这里提到的:Is mclapply 保证按顺序返回其结果?)。我怎样才能让 R Studio 打印类似的东西
x <- mclapply(1:20, function(i) cat(i, "\n"))
到控制台?
我尝试过 print()、cat()、write(),但它们似乎都不起作用。我还尝试mc.silent = FALSE
显式设置而没有效果。
与 GUI 的并行处理是有问题的。我写了很多并行代码,它经常让我同事的电脑崩溃,因为他坚持使用 Rstudio 而不是控制台 R。
根据我的阅读,RStudio“不会将分叉进程的输出传播到 RStudio 控制台。如果您这样做,最好通过 shell 启动 R。”
这对于 RStudio 人员来说是一种解决方法是有意义的,因为当人们尝试从一堆不同的进程输出到 GUI 时,并行处理通常会破坏 GUI。它在控制台中工作(尽管通常不是按顺序),但是当并行处理专家听到来自分叉线程的任何 I/O 时,他们会捏住鼻子。
如果您必须有来自分叉线程的输出,请将它们保存在字符串中并返回。然后从主进程中收集并输出。或者只是使用控制台进行并行运行。我告诉我的同事是在 RStudio 中使用 进行所有调试和开发lapply()
,然后切换到控制台进行实际运行。
这是使用 shellecho
打印到 Rstudio 中的 R 控制台的解决方法:
#' Function which prints a message using shell echo; useful for printing messages from inside mclapply when running in Rstudio
message_parallel <- function(...){
system(sprintf('echo "\n%s\n"', paste0(..., collapse="")))
}
只是扩展了提问者使用的解决方案,即写入文件以检查进度:
write.file = '/temp_output/R_progress'
time1 = proc.time()[3]
outstuff = unlist(mclapply(1:1000000, function(i){
if (i %% 1000 == 0 ){
file.create(write.file)
fileConn<-file(write.file)
writeLines(paste0(i,'/',nrow(loc),' ',(i/nrow(loc)*100)), fileConn)
close(fileConn)
}
#do your stuff here
}, mc.cores=6))
print(proc.time()[3] - time1)
然后你可以从控制台监控
tail -c +0 -f '/temp_output/R_progress'