我試圖在R中創建一個函數,它返回函數調用1後的前x秒,下x秒0,下x秒1再次。整個過程應在另一個時間間隔後或n次迭代後停止。我想用一個函數調用來做到這一點。如何在R中創建一個定時器功能
我讀了關於包tcltk,它顯然需要創建這樣的「計時器」功能的一些可能性,但我沒有找到足夠的解釋來解決我的問題。
你能否告訴我在哪裏可以找到一個很好的手冊來解釋與R語境中的tcl?你有沒有其他想法如何以有效的方式創建這樣一個功能?
非常感謝您的幫助。
我試圖在R中創建一個函數,它返回函數調用1後的前x秒,下x秒0,下x秒1再次。整個過程應在另一個時間間隔後或n次迭代後停止。我想用一個函數調用來做到這一點。如何在R中創建一個定時器功能
我讀了關於包tcltk,它顯然需要創建這樣的「計時器」功能的一些可能性,但我沒有找到足夠的解釋來解決我的問題。
你能否告訴我在哪裏可以找到一個很好的手冊來解釋與R語境中的tcl?你有沒有其他想法如何以有效的方式創建這樣一個功能?
非常感謝您的幫助。
如果我理解你正確,你正在試圖創建時,它被稱爲第一個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)
}
}
可以使用該創建過程中交替每隔10秒0和1之間的函數第60秒,並返回-1 60秒後:
> flp <- flipper(10,60)
現在呼籲flp()
將有你要找的行爲,即當你在接下來的60秒稱之爲flp()
,它將在1和0之間交替每10秒秒,那麼在60秒後它將返回-1。
Sys.sleep
從基地不能解決?
如:停止在一個循環中每10個迭代10秒:
for (i in 1:100) {
# do something
if ((i %% 10) == 0) {
Sys.sleep(10)
}
}
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()
如果它超過一定值?
之後的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.")
})
我還建議:
定時器1
library(data.table)
begin.time <- Sys.time()
timetaken(begin.time)
定時器2
library(matlab)
tic(gcFirst=FALSE)
toc(echo=TRUE)
兩者都是計時器極好的選擇
你想`T0 < - Sys系統.time`,否則你會在全局scop中修改`t0` e(如果它已經存在) – hadley 2011-01-31 17:56:00