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

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

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

на консоль?

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

Спасибо за ваши ответы, мой лучший, Бен

Ответ 1

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

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

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

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

Ответ 2

Просто немного расширяя решение, используемое апеллятором, то есть записывая файл для проверки прогресса:

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'