2011-10-26 33 views
7

我想在R中掌握setTimeLimit(),并且我的经验已经导致了几个相关的问题,所以也许最基本的问题是:这是如何工作的? (我一直在寻找evalWithTimeout()R.utils为好,它可能适合我的目的稍微好一点,但它是建立在此功能)setTimeLimit如何在R中工作?

这里是我试图找出关键的东西:

  1. 它如何监测经过的时间?即它似乎被插入到流量控制中,那么它是如何做到的?能够拥有“背景”流程非常酷,可以用于报告状态,检查点等等。

  2. 我可以确定剩下多少时间直到它被触发吗?我意识到我可以将它包装并在某处存储在调用点(即proc.time()的输出)消耗的已用过的CPU时间。但是,这个函数已经存储了这些地方,我想知道在哪里,或者至少如何确定剩余时间。

  3. 如果R控制台闲置,是否可以做一些有用的事情?能够监测elapsed.time()cpu.time()是非常有用的。我希望能够监视R什么时候处于空闲状态,但从修补程序看来,它需要提交或完成一个命令。而且,仅输出错误不会触发后续操作。 (也许我需要更多关注evalWithTimeout。)

  4. 帮助信息表明它可以适用于C或Fortran,但不提供示例。有关如何完成这件事的任何建议?

+1

多少经验,你有多线程编程?我记得,这只是挂钩回调机制,因此每唤醒几个处理周期。有一些例子可以使用这个例如用当前时间更新R终端会话的提示---这本身就是一个愚蠢的例子,但是仍然是一个有用的例子。 –

+0

我可以使用多线程编程。我认为这是一个回调,但并没有试图阻止。有趣的是,它似乎不出现在'getTaskCallbackNames()'或'taskCallbackManager()'下面。 – Iterator

回答

3

为了证明setTimeLimit C函数调用期间不工作:

rfunction <- function(){ 
    repeat{ 
     x <- rnorm(100); 
    } 
} 

cfunction <- function(){ 
    x <- eigen(matrix(rnorm(1e6), 1e3)); 
} 

setTimeLimit(3); 
system.time(try(rfunction(), silent=TRUE)) 
system.time(try(cfunction(), silent=TRUE))