Как лучше всего создать функцию таймера в R - PullRequest
5 голосов
/ 31 января 2011

Я пытаюсь создать функцию в R, которая будет возвращаться в течение первых x секунд после вызова функции 1, следующих x секунд 0, еще раз следующих x секунд 1, ... вся процедура должна прекратиться через другое времяинтервал или после n итераций.Я хочу сделать это с помощью одного вызова функции.

Я читал о пакете tcltk, который, по-видимому, влечет за собой некоторые возможности для создания таких «таймерных» функций, однако я не нашел достаточно объяснений, чтобы разобраться в моей проблеме.

Не могли бы вы посоветовать мне, где найти хорошее руководство, объясняющее tcl в контексте с R?У вас есть другие идеи, как эффективно создать такую ​​функцию?

Большое спасибо за вашу помощь.

Ответы [ 5 ]

9 голосов
/ 31 января 2011

Если я вас правильно понял, вы пытаетесь создать функцию, которая будет возвращать 1 при каждом вызове в первые x секунд, затем возвращать 0 при каждом вызове в следующие x секунд, а затем возвращать 1 в течение следующих x секунди т. д. И по истечении определенного 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)
  }
}

Вы можете использовать это для создания функции, которая чередуется от 0 до 1 каждые 10 секунд в течение первых 60 секунд и возвращает -1 через 60 секунд:

> flp <- flipper(10,60)

Сейчасвызов flp() будет иметь то поведение, которое вы ищете, то есть, когда вы звоните flp() в течение следующих 60 секунд, оно будет меняться от 1 до 0 каждые 10 секунд, а через 60 секунд будет просто возвращать -1.

7 голосов
/ 31 января 2011

Sys.sleep из базы не может быть решением?

Например: остановить каждую 10-ю итерацию в цикле на 10 секунд:

for (i in 1:100) {
    # do something
    if ((i %% 10) == 0) {
        Sys.sleep(10)
    }
}
5 голосов
/ 30 октября 2011

Могу ли я также предложить:

Таймер 1

library(data.table)

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

Таймер 2

library(matlab)

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

Оба являются отличным выбором для таймеров

1 голос
/ 01 февраля 2011

Команда tcltk after вызовет функцию после некоторой задержки.Привести его к повторному вызову можно следующим образом (усложнить это желание иметь разные интервалы между событиями).

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.")
})
0 голосов
/ 31 января 2011
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(), если оно превышает определенное значение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...