如何在R中最好地创建定时器功能

时间:2011-01-31 16:50:50

标签: algorithm r timer tcl

我正在尝试在R中创建一个函数,它返回函数调用1后的前x秒,下一个x秒0,再下一个x秒1,...整个过程应该在另一个时间后停止间隔或n次迭代后。我想通过一个函数调用来做到这一点。

我读到了包tcltk,这显然需要一些创建这种“计时器”功能的可能性,但是我没有找到足够的解释来解决我的问题。

你能告诉我在哪里可以找到一个好的手册,用R解释tcl吗?您是否有其他想法如何以有效的方式创建这样的功能?

非常感谢你的帮助。

5 个答案:

答案 0 :(得分:9)

如果我理解正确,你试图创建一个函数,只要在第一个x秒内调用它就会返回1,然后在下一个x秒调用时返回0,然后在接下来的x秒内返回1在某个total时间之后,应该“完成”,也许返回-1?

您可以使用以下函数执行此操作,该函数将“创建”具有任何所需间隔的函数:

flipper <- function(interval=10, total = 60) {
  t0 <- Sys.time()
  function() {
    seconds <- round(as.double( difftime(Sys.time(), t0, u = 'secs')))
    if(seconds > total)
      return(-1) else
    return(trunc( 1 + (seconds / interval ) ) %% 2)
  }
}

您可以使用此功能创建一个在前60秒内每10秒交替0到1之间的功能,并在60秒后返回-1:

> flp <- flipper(10,60)

现在呼叫flp()将会有您正在寻找的行为,即当您在接下来的60秒内呼叫flp()时,它将每10秒在1到0之间交替,然后在60秒之后只会返回-1。

答案 1 :(得分:7)

来自基地的

Sys.sleep无法解决问题?

例如:在循环中每隔10次迭代停止10秒钟:

for (i in 1:100) {
    # do something
    if ((i %% 10) == 0) {
        Sys.sleep(10)
    }
}

答案 2 :(得分:4)

我还建议:

计时器1

library(data.table)

begin.time <- Sys.time()
timetaken(begin.time)

计时器2

library(matlab)

tic(gcFirst=FALSE)
toc(echo=TRUE)

两者都是计时器的绝佳选择

答案 3 :(得分:1)

之后的tcltk命令会在一段时间后调用一个函数。让它重复调用可以按照以下几行进行(由于希望在事件之间有不同的间隔,因此更复杂)。

afterID <- ""
someFlag <- TRUE
MS <- 5000                              # milliseconds
repeatCall <- function(ms=MS, f) {
  afterID <<- tcl("after", ms, function() {
    if(someFlag) {                      
      f()
      afterID <<- repeatCall(MS - ms, f)
    }  else {
      tcl("after", "cancel", afterID)
    }
  })
}
repeatCall(MS, function() {
  print("Running. Set someFlag <- FALSE to stop.")
})

答案 4 :(得分:0)

timefun <- function(interval = 10, output = c(0, 1)) {

  start <- Sys.time()

  # do some stuff
  for (i in 1:99999) paste(i, i^2)

  # how many intervals did it take
  elapsed <- as.numeric(round(Sys.time() - start)) / interval

  output[elapsed %% length(output) + 1]
}

我不清楚“整个过程应该在另一个时间间隔后或在n次迭代之后停止”,你想在功能执行期间定期检查经过的时间吗?stop()是否高于某个值?