2015-12-18 13 views
11

Ich versuche, etwas "richtig" zu machen. Manchmal dauert "der richtige Weg" abhängig von den Eingaben zu lange. Ich kann nicht wirklich a priori wissen, wann das sein wird. Wenn "der richtige Weg" zu lange dauert, möchte ich auf den "hackischen Weg" gehen. Wie mache ich R zu überwachen, wie lange eine bestimmte Aufgabe dauert, und geben Sie etwas anderes zu tun, wenn ein Schwellenwert überschritten wurde? Ich könnte mir vorstellen, dass dies Teil der try Familie sein wird, aber ich bin mir nicht sicher, was ich es nennen oder googeln soll.Wie kann man eine Funktion in R stoppen, die zu lange dauert und eine Alternative gibt?

Dummy-Beispiel unten. Wenn slow.func zu lange dauert, möchte ich interuptor stoppen und stattdessen fast.func anrufen.

slow.func <- function(x){ 
    Sys.sleep(x)  
    print('good morning') 
} 

fast.func <- function(x){ 
    Sys.sleep(x/10) 
    print('hit snooze') 
} 

interuptor = function(FUN,args, time.limit, ALTFUN){ 
# START MONITORING TIME HERE 
    do.call(FUN,args) 
# IF FUN TAKES TOO LONG, STOP IT, CALL A 
    do.call(ALTFUN,args) 
} 

interuptor(slow.func, list(x = 2), time.limit = 1, fast.func) 
+0

Wie würde ich eine Zeitprüfung hinzufügen? –

+0

yeah Ich laufe nur R. Ich habe kein C. gelernt. Wäre es trivial, in diesem Fall ein einfaches C-Programm zu schreiben und zu kompilieren und es mit '.C' zu benennen? –

Antwort

7

Das R-Paket R.utils eine Funktion hat evalWithTimeout, die genau so ziemlich das, was Sie beschreiben. Wenn Sie nicht über ein Paket installieren wollen, setzt evalWithTimeout auf die weniger benutzerfreundlich R Basisfunktion setTimeLimit

Ihr Code würde wie folgt aussehen:

library(R.utils) 

slow.func <- function(x){ 
    Sys.sleep(10)  
    return(x^2) 
} 

fast.func <- function(x){ 
    Sys.sleep(2) 
return(x*x) 
} 
interruptor = function(FUN,args, time.limit, ALTFUN){ 
    results <- NULL 
    results <- evalWithTimeout({FUN(args)},timeout=time.limit,onTimeout="warning") 
    if(results==NULL){ 
    results <- ALTFUN(args) 
    } 
    return(results) 
} 
interruptor(slow.func,args=2,time.limit=3,fast.func) 
1

Die Antwort von „nwknoblauch“ funktioniert nicht für mich, es sei denn, Sie ändern "Warnung" durch "still" innerhalb der Unterbrecherfunktion.

library(R.utils) 

slow.func <- function(x){ 
    Sys.sleep(10)  
    return(x^2) 
} 

fast.func <- function(x){ 
    Sys.sleep(2) 
return(x*x) 
} 

interruptor = function(FUN,args, time.limit, ALTFUN){ 
    results <- NULL 
    results <- evalWithTimeout({FUN(args)},timeout=time.limit,onTimeout="silent") 
    if(is.null(results)){ 
    results <- ALTFUN(args) 
    } 
    return(results) 
} 
interruptor(FUN = slow.func,args=2,time.limit=3,ALTFUN = fast.func) 
Verwandte Themen