Возврат system.time из оцененной функции - PullRequest
3 голосов
/ 03 ноября 2011

R версия 2.12, Windows XP

Я пытаюсь написать функцию (скажем, «g»), которая принимает один аргумент, функцию (скажем, «f») и возвращает соответствующую функцию. Кроме того, внутри тела 'g' находится оператор, который сообщает результирующему объекту возвращать значение system.time при вызове объекта. Пример проясню.

Что я хочу:

g <- function(f) {...}
z <- g(mean)
z(c(1, 4, 7))

с выводом

user system elapsed
0.04   0.00    0.04

Что у меня есть:

g <- function(f) {if (!exists("x")) {x <- match.fun(f)} else {system.time(x)}}
z <- g(mean)
z(c(1, 4, 7))

с выводом

[1] 4

Любая помощь очень ценится.

Ответы [ 2 ]

3 голосов
/ 03 ноября 2011

Может быть, это поможет:

g <- function(f){
  function(x){
    zz <- system.time(
        xx <- match.fun(f)(x)
    )
    list(value=xx, system.time=zz)
  }
}

Используется:

g(mean)(c(1, 4, 7))

$value
[1] 4

$system.time
   user  system elapsed 
      0       0       0 

Возможно, вы захотите подумать о том, как вы возвращаете значения. Я использовал список, но другой вариант - вывести системное время в качестве побочного эффекта и вернуть рассчитанное значение.

1 голос
/ 04 ноября 2011

Недавно я сделал подобную функцию для себя:

with_times <- function(f) {
    f <- match.fun(f)
    function(...) {
        .times <- system.time(res <- f(...))
        attr(res, "system.time") <- as.list(na.omit(.times))
        res
    }
}

Например:

g <- function(x,y) {r<-x+y; Sys.sleep(.5); r}
g(1, 1)
# [1] 2
g2 <- with_times(g) 
w <- g2(1, 1)

Время может быть извлечено двумя способами:

attributes(w)$system.time
# $user.self
# [1] 0
# $sys.self
# [1] 0
# $elapsed
# [1] 0.5

или

attr(w, "system.time")
# $user.self
# [1] 0
# $sys.self
# [1] 0
# $elapsed
# [1] 0.5
...