2013-06-27 4 views
6

バッチモードで実行したときにRスクリプト内のステートメントの実行時間をよく理解したいと思います。これを行う良い方法はありますか?Rバッチモードのエコータイムスタンプ

私はこのことをどのようにしたいと思うか考えました。バッチで実行すると、ソースは指定されたログファイルにエコーされます。このログファイルにソースコードの横にタイムスタンプをエコーする方法はありますか?

> R CMD BATCH script.R script.Rout 

これは私が今日見た出力です。

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

私のようなものを見てみたいと思います...

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

答えて

5

次のようにaddTaskCallbackを使用して、各トップレベル実行のログを作成できます。もちろん

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

代わりdata.frame行方向成長の枢機卿罪を犯すの私がここに持っているとして、あなただけの接続を開いたままにして、ファイルに直接書き込み、on.exitとの接続を閉じることができます。

あなたがそれについて整理したいのであれば、ロギング設定を関数にきちんと組み込むことができます。

.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を参照してください。 POSIXct datetimeを返します。これは、ログファイルに出力するときにフォーマットする必要があります。

cat(format(Sys.time()), " is the current time\n") 
関連する問題