2013-04-23 2 views
1

Я использую пакет parallel для выполнения вычислений. Вот это игрушка пример:stdout и stderr параллельных вычислений в R

library(parallel) 
m = matrix(c(1,1,1,1,0.2,0.2,0.2,0.2), nrow=2) 
myFun = function(x) { 
    if (any(x<0.5)) { 
    write("less than 0.5", stderr()) 
    return(NA) 
    } else { 
    write("good", stdout()) 
    return(mean(x)) 
    } 
} 
cl = makeCluster(2, outfile="/tmp/output") 
parApply(cl, m, 2, myFun) 
stopCluster(cl) 

Проблема как стандартный вывод и стандартный поток ошибок будет перенаправлен на /tmp/output. Файл output выглядит следующим образом:

starting worker pid=51083 on localhost:11953 at 11:37:12.966 
starting worker pid=51093 on localhost:11953 at 11:37:13.261 
good 
good 
less than 0.5 
less than 0.5 

Есть ли способ установка два отдельных файлов для стандартного вывода и стандартного потока ошибок, соответственно? и как игнорировать первые две строки «start worker pid = ...»?

ответ

2

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

cl = makeCluster(2) 

setup = function(outfile, errfile) { 
    assign("outcon", file(outfile, open="a"), pos=.GlobalEnv) 
    assign("errcon", file(errfile, open="a"), pos=.GlobalEnv) 
    sink(outcon) 
    sink(errcon, type="message") 
} 

shutdown = function() { 
    sink(NULL) 
    sink(NULL, type="message") 
    close(outcon) 
    close(errcon) 
    rm(outcon, errcon, pos=.GlobalEnv) 
} 

clusterCall(cl, setup, "/tmp/output", "/tmp/errmsg") 
parApply(cl, m, 2, myFun) 
clusterCall(cl, shutdown) 

Так как выпускаются до того setup «стартовых» рабочих сообщения называется, эти сообщения перенаправляются на «/ dev/null», что является поведением по умолчанию, когда outfile не указан.

Смежные вопросы