17

我在 RStudio 中使用 mclapply 并希望从每个进程向控制台输出一个输出,但这似乎以某种方式被抑制(例如这里提到的:Is mclapply 保证按顺序返回其结果?)。我怎样才能让 R Studio 打印类似的东西

x <- mclapply(1:20, function(i) cat(i, "\n"))

到控制台?

我尝试过 print()、cat()、write(),但它们似乎都不起作用。我还尝试mc.silent = FALSE显式设置而没有效果。

4

3 回答 3

12

与 GUI 的并行处理是有问题的。我写了很多并行代码,它经常让我同事的电脑崩溃,因为他坚持使用 Rstudio 而不是控制台 R。

根据我的阅读,RStudio“不会将分叉进程的输出传播到 RStudio 控制台。如果您这样做,最好通过 shell 启动 R。”

这对于 RStudio 人员来说是一种解决方法是有意义的,因为当人们尝试从一堆不同的进程输出到 GUI 时,并行处理通常会破坏 GUI。它在控制台中工作(尽管通常不是按顺序),但是当并行处理专家听到来自分叉线程的任何 I/O 时,他们会捏住鼻子。

如果您必须有来自分叉线程的输出,请将它们保存在字符串中并返回。然后从主进程中收集并输出。或者只是使用控制台进行并行运行。我告诉我的同事是在 RStudio 中使用 进行所有调试和开发lapply(),然后切换到控制台进行实际运行。

于 2014-08-04T19:54:48.647 回答
4

这是使用 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="")))
}
于 2020-08-12T08:25:31.587 回答
1

只是扩展了提问者使用的解决方案,即写入文件以检查进度:

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'

于 2015-06-20T00:01:48.753 回答