6

当以批处理模式运行时,我想更好地了解 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)
4

2 回答 2

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()
于 2013-06-27T16:05:25.170 回答
2

?Sys.time。它返回一个POSIXct日期时间,您需要在输出到日志文件时对其进行格式化。

cat(format(Sys.time()), " is the current time\n")
于 2013-06-27T15:30:33.770 回答