可能,我只是错过了一个参数...但是,也许有人可以指出我:如何在R中运行分析并将结果存回某处?我知道R函数只能返回一个对象,但我可以在这里使用列表或粘贴基准测试结果并将分析存储在函数的返回值中。
但是,有没有办法评估基准(或system.time
)和分析而不像这样运行两次?:
require(rbenchmark)
bmark <- function(x){
res <- list()
res[[1]] <- benchmark(x^6)
res[[2]] <- x^6
res
}
编辑:对不起,我对我真正想做的事情感到困惑。也许用例更清楚:我没有一个典型的基准测试情况,我想检查我的自定义函数是否比其他函数更快。相反,我在不同的机器上使用不同的数据运行相同的东西。我不需要在测试环境中使用它,但是在生产中 - 我只想让脚本的用户知道花了多长时间。如果这是一个小时或更长的人可以计划他们的午休:)。
答案 0 :(得分:8)
这是使用两个函数的示例。第一个使用plyr
,第二个使用data.table
。
# dummy data
require(plyr)
require(data.table)
set.seed(45)
x1 <- data.frame(x=rnorm(1e6), grp = sample(letters[1:26], 1e6, replace=T))
x1.dt <- data.table(x1, key="grp")
# function that uses plyr
DF.FUN <- function(x) {
ddply(x1, .(grp), summarise, m.x = mean(x))
}
# function that uses data.table
DT.FUN <- function(x) {
x1.dt[, list(m.x=mean(x)),by=grp]
}
require(rbenchmark)
> benchmark( s1 <- DF.FUN(), s2 <- DT.FUN(), order="elapsed", replications=2)
# test replications elapsed relative user.self sys.self user.child sys.child
# 2 s2 <- DT.FUN() 2 0.036 1.000 0.031 0.006 0 0
# 1 s1 <- DF.FUN() 2 0.527 14.639 0.363 0.163 0 0
现在,s1
和s2
包含每个功能的结果,基准测试结果将显示在屏幕上。
# > head(s1)
# grp m.x
# 1 a 0.0069312201
# 2 b -0.0002422315
# 3 c -0.0129449586
# 4 d -0.0036275338
# 5 e 0.0013438022
# 6 f -0.0015428427
# > head(s2)
# grp m.x
# 1: a 0.0069312201
# 2: b -0.0002422315
# 3: c -0.0129449586
# 4: d -0.0036275338
# 5: e 0.0013438022
# 6: f -0.0015428427
这是你追求的吗?
答案 1 :(得分:1)
我读到的问题与阿伦有点不同。这将是我认为被问到的答案:
> bres <- bmark(2)
> bres
[[1]]
test replications elapsed relative user.self sys.self user.child sys.child
1 x^6 100 0.001 1 0.001 0.001 0 0
[[2]]
[1] 64
bmark函数返回默认100次重复的结果。你想要注释你可以使用paste()的结果,如果你想为reps数添加一个参数:
bmark2 <- function(x, reps=100){
res <- list()
res[[1]] <- benchmark(x^6, replications=reps)
res[[2]] <- paste(reps, " replications of ", x, "to the 6th in", res[[1]]$elapsed)
res
}
答案 2 :(得分:1)
我不确定StackOverflow对回答旧问题的看法,但似乎在编辑后没有人真正回答。所以这里:
要在R中计算进程,可以使用两种方法。
第一个使用system.time(expression)
,并给出您在括号内评估表达式所花费的时间。
如果这在您的情况下不实用,您可以在操作之前和操作之后获得Sys.time()
的系统时间并减去两者。
如果这最终回答了您的问题,请接受解决方案:)