我正在尝试在R中创建一个函数,它返回函数调用1后的前x秒,下一个x秒0,再下一个x秒1,...整个过程应该在另一个时间后停止间隔或n次迭代后。我想通过一个函数调用来做到这一点。
我读到了包tcltk,这显然需要一些创建这种“计时器”功能的可能性,但是我没有找到足够的解释来解决我的问题。
你能告诉我在哪里可以找到一个好的手册,用R解释tcl吗?您是否有其他想法如何以有效的方式创建这样的功能?
非常感谢你的帮助。
答案 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()
是否高于某个值?