2011-01-31 7 views
5

함수 호출 1, 다음 x 초 0, 다음 x 초 1, 다시 1 초 후 반환하는 함수를 R에서 만들려고합니다. . 전체 절차는 다른 시간 간격 후에 또는 n 번의 반복 후에 중단되어야한다. 하나의 함수 호출로이 작업을 수행하려고합니다.타이머 함수를 가장 잘 만드는 방법 R

"타이머"기능을 만들 수있는 몇 가지 가능성이있는 패키지 tcltk에 대해 읽었지 만 문제를 해결하기에 충분한 설명을 찾지 못했습니다.

R과 관련하여 tcl을 설명하는 좋은 설명서를 어디에서 찾을 수 있는지 알려 주실 수 있습니까? 효율적인 방법으로 그러한 함수를 만드는 방법에 대한 아이디어가 있습니까?

도움을 주셔서 감사합니다.

답변

9

: 10 초 동안 루프의 모든 10 반복을 중지 다음 번 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) 
    } 
} 

당신은 동안 0과 1 사이 매 10 초를 번갈아 함수를 만들려면이를 사용할 수 있습니다

당신이 원하는 간격으로 함수를 "만드는"것 다음 함수를 사용하여이 작업을 수행 할 수 처음 60 초 및 -1을 반환 60 초 후 : 당신이 다음 60 초 동안 flp()를 호출 할 때

> flp <- flipper(10,60) 

지금 당신이 찾고있는 행동을해야합니다 flp()를 호출, 즉, 그것은 모든 1과 0 교대한다 10 초 60 초 후에 -1을 반환합니다. 이 일정 값 이상이라면

+1

당신은'T0 <원하는 - sys 인을 .time', 그렇지 않으면 전역 스코프에서't0'을 수정합니다. e (이미있는 경우) – hadley

+0

네, 고쳐 주셔서 감사합니다. –

7

Sys.sleep 기지에서 해결할 수 없습니까?

예 : 나는 당신이 정확하게 당신이 첫 번째 X의 초에 호출 될 때마다 1을 반환하는 함수를 만들려고 이해하면

for (i in 1:100) { 
    # do something 
    if ((i %% 10) == 0) { 
     Sys.sleep(10) 
    } 
} 
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()?

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

는 또한 제안 수 :

타이머 1

library(data.table) 

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

타이머 2

library(matlab) 

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

두 타이머를위한 훌륭한 선택이가

관련 문제