2013-06-27 24 views
6

Chciałbym lepiej zrozumieć czas trwania instrukcji w skrypcie R, gdy uruchamiany jest tryb wsadowy. Czy jest to dobry sposób na zrobienie tego?Echowy znacznik czasu w trybie wsadowym R

Miałem jedną myśl o tym, jak chciałbym, aby to się stało. Podczas wykonywania wsadowego, źródło jest wysyłane do podanego pliku dziennika. Czy istnieje sposób, aby echo sygnatury czasowej obok kodu źródłowego w tym pliku dziennika?

> R CMD BATCH script.R script.Rout 

Oto wyniki, które widzę dzisiaj.

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

chciałbym zobaczyć coś jak ...

> 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) 

Odpowiedz

5

Możesz użyć addTaskCallback w następujący sposób, aby utworzyć dziennik każdego wykonania najwyższego poziomu.

.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() 

Oczywiście zamiast popełnienia grzechu kardynalną uprawy data.frame row-mądry, jak mam tu można po prostu zostawić otwarte połączenie i pisać bezpośrednio do pliku, zamknięcie połączenia z on.exit.

A jeśli chcesz się tym zajmować, spakuj konfigurację rejestrowania do ładnej funkcji.

.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

Zobacz ?Sys.time. Zwraca ona datetime o wartości POSIXct, którą należy sformatować podczas wysyłania do pliku dziennika.

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