在R Studio中使用mclapply打印输出

20

我正在使用RStudio的mclapply功能,并希望从每个进程中输出到控制台,但似乎这种输出被某种方式压制了(例如在这里提到:Is mclapply guaranteed to return its results in order?)。 如何让R Studio打印出像

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

这样的内容到控制台?

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


2
我通过先将输出写入文件,然后使用一个小的Python脚本读取和打印该文件的内容来“解决”了这个问题。虽然不太好看,但足以获取有关mclapply进度的一些信息。 - obachtos
3个回答

13

使用GUI进行并行处理存在问题。我写了很多并行代码,但是当我的同事坚持使用Rstudio而不是控制台R时,它经常会导致他的电脑崩溃。

从我所了解的情况来看,“RStudio无法将分叉进程的输出传递到RStudio控制台。如果您要这样做,最好通过shell启动R。”

对于RStudio用户来说,这是一个可行的解决方案,因为并行处理通常会在尝试从多个进程输出到GUI时破坏GUI。虽然这种方法在控制台中可以工作(尽管通常无序),但是并行处理专家听到任何来自分叉线程的I/O都会感到不舒服。

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


6
以下是翻译后的内容:

这里提供一种解决方案,使用shell的echo函数在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="")))
}

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'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接