Печать из mclapply в R Studio

Я использую mclapply изнутри RStudio и хотел бы получить вывод на консоль от каждого процесса, но, похоже, это как-то подавлено (как упомянуто, например, здесь: гарантированно ли mclapply будет возвращать свои результаты по порядку?). Как я могу заставить R Studio напечатать что-то вроде

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

на консоль?

Я пробовал print(), cat(), write(), но все они, похоже, не работают. Я также пытался установить mc.silent = FALSE явно без эффекта.

2 ответа

Параллельная обработка с GUI проблематична. Я пишу много параллельного кода, и он постоянно ломает компьютер моего коллеги, потому что он настаивает на использовании Rstudio вместо консоли R.

Из того, что я прочитал, RStudio "не распространяет вывод разветвленных процессов на консоль RStudio. Если вы делаете это, лучше всего запускать R через оболочку".

Это имеет смысл как обходной путь для людей RStudio, потому что параллельная обработка обычно ломает GUI, когда люди пытаются вывести на GUI из группы различных процессов. Он работает в консоли (хотя часто и не по порядку), но гуру параллельной обработки ущипнут свои носы, когда услышат о каком-либо вводе-выводе из разветвленного потока.

Если вы должны иметь вывод из разветвленных потоков, сохраните их в строку и верните. Затем собирать и выводить из основного процесса. Или просто используйте консоль для ваших параллельных прогонов. Что я говорю своему коллеге, так это выполняю все его отладки и разработки в RStudio, используя lapply(), затем переключитесь на консоль для реального запуска.

Вот обходной путь, который использует оболочку echo для печати на консоль R в Rstudio:

#' 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'

Другие вопросы по тегам