2013-06-27 16 views
6

Toplu iş modunda çalışırken bir R komut dosyasındaki ifadelerin yürütme süresini daha iyi anlamak isterim. Bunu yapmanın iyi bir yolu var mı?R Toplu İş Modunda Eko Zaman Damgası

Bunun nasıl yapıldığını görmek istediğim hakkında bir fikrim vardı. Toplu iş yürütülürken, kaynak belirtilen günlük dosyasına eklenir. Bu günlük dosyasındaki kaynak kodun yanında bir zaman damgası yankılamasının bir yolu var mı?

> R CMD BATCH script.R script.Rout 

İşte bugün gördüğüm çıktı.

> tail -f script.Rout 
... 
> # features related to the date 
> trandateN <- as.integer(trandate) 
> dayOfWeek <- as.integer(wday(trandate)) 
> holiday <- mapply(isHoliday, trandate) 

Ben böyle bir şey görmek istiyorum ...

> tail -f script.Rout 
... 
2013-06-27 11:18:01 > # features related to the date 
2013-06-27 11:18:01 > trandateN <- as.integer(trandate) 
2013-06-27 11:18:05 > dayOfWeek <- as.integer(wday(trandate)) 
2013-06-27 11:19:02 > holiday <- mapply(isHoliday, trandate) 

cevap

5

her üst düzey yürütme günlüğünü oluşturmak için aşağıdaki şekilde addTaskCallback kullanabilirsiniz.

.log <- data.frame(time=character(0), expr=character(0)) 
.logger <- function(expr, value, ok, visible) { # formals described in ?addTaskCallback 
    time <- as.character(Sys.time()) 
    expr <- deparse(expr) 
    .log <<- rbind(.log, data.frame(time, expr)) 
    return(TRUE) # required of task callback functions 
} 
.save.log <- function() { 
    if (exists('.logger')) write.csv(.log, 'log.csv') 
} 
addTaskCallback(.logger) 

x <- 1:10 
y <- mean(x) 

.save.log() 
.log 
#      time      expr 
# 1 2013-06-27 12:01:45.837 addTaskCallback(.logger) 
# 2 2013-06-27 12:01:45.866    x <- 1:10 
# 3 2013-06-27 12:01:45.876    y <- mean(x) 
# 4 2013-06-27 12:01:45.900    .save.log() 

yerine burada olduğu gibi, bir data.frame sıra sıra büyüyen asli günah işlemekten Tabii ki, on.exit ile bağlantıyı kapatmadan, sadece açık bir bağlantı bırakın ve dosyaya doğrudan yazabilirsiniz.

Ve bu konuda düzenli olmak istiyorsanız, günlük kurulum ayarlarını oldukça güzel bir işlev haline getirebilirsiniz.

.log <- function() { 
    .logger <<- local({ 
     log <- data.frame(time=character(0), expr=character(0)) 
     function(expr, value, ok, visible) { 
      time <- as.character(Sys.time()) 
      expr <- deparse(expr) 
      log <<- rbind(log, data.frame(time, expr)) 
      return(TRUE) 
     } 
    }) 
    invisible(addTaskCallback(.logger)) 
} 

.save.log <- function() { 
    if (exists('.logger')) 
     write.csv(environment(.logger)$log, 'log.csv') 
} 

.log() 
x <- 1:10 
y <- mean(x) 
.save.log() 
2

?Sys.time bakınız. Bir günlük dosyasına çıktı verirken biçimlendirmeniz gereken bir POSIXct datetime değerini döndürür.

cat(format(Sys.time()), " is the current time\n")