4

使用简单的测试功能

timefoo<-function(x,trans=TRUE){
setTimeLimit(elapse=4, transient=trans)
warning('starting...')
Sys.sleep(x)
warning('woke up')
return(x)
}

当我调用时,函数会正确终止,例如timefoo(5),但是:

 timefoo(3)
[1] 3
Warning messages:
1: In timefoo(3) : starting...
2: In timefoo(3) : woke up
Error: reached elapsed time limit

有人可以解释到底发生了什么吗?就好像在完成并退出setTimeLimit后继续运行。timefoo设置transient=FALSE更糟,因为它会为我的控制台命令设置超时,并在每个命令后(加上 4 秒)给我错误消息。

编辑:为了回答 Gavin 的问题,这里有两个电话的序列

Rgames> timefoo(5)
Error in Sys.sleep(x) : reached elapsed time limit
In addition: Warning message:
In timefoo(5) : starting...
Rgames> timefoo(3)
[1] 3
Warning messages:
1: In timefoo(3) : starting...
2: In timefoo(3) : woke up
Error: reached elapsed time limit

我在命令之间手动等待了 10 秒,所以毫无疑问最终的错误消息是由于timefoo(3)调用造成的。是否有任何我可能弄乱的 R_ENVIRON 变量导致了这种行为?到目前为止,我只在 Windows7、R64 上对此进行了测试。

4

1 回答 1

4

我收到相同的错误消息(在 Win 7 下运行 R-2.16 devel)。

帮助页面?setTimeLimit指出:

'setTimeLimit' 设置适用于每个顶级计算的限制,即在控制台或文件中输入的命令行(包括任何续行)。

所以它并不是真正设计为从函数内部运行的。如果您想这样做,请尝试以下替代方法:

timed_computation <- function(expr, time_limit = 1)
{
  setTimeLimit(elapsed = time_limit, transient = TRUE)
  ans <- expr
  setTimeLimit(elapsed = Inf, transient = TRUE)
  ans
}

timed_computation(1 + 1)            #should return 2
timed_computation(Sys.sleep(2))     #should throw an error
于 2012-09-20T15:41:40.440 回答