2013-01-22 11 views
16

C'è un modo per fermare un programma R senza errori?Arresta un programma R senza errori

Ad esempio, ho una grande fonte, che definisce diverse funzioni e dopo di essa ci sono alcune chiamate alle funzioni. Succede che modifico alcune funzioni e voglio che le definizioni delle funzioni siano aggiornate in ambiente R, ma non vengono effettivamente chiamate.

Ho definito una variabile justUpdate e quando è TRUE si desidera interrompere il programma subito dopo le definizioni di funzione.

ReadInput <- function(...) ... 
Analyze <- function(...) ... 
WriteOutput <- function(...) ... 

if (justUpdate) 
    stop() 
# main body 
x <- ReadInput() 
y <- Analyze(x) 
WriteOutput(y) 

ho chiamato stop() funzione, ma il problema è che esso stampa un messaggio di errore.

Ctrl +c è un'altra opzione, ma voglio fermare la fonte in linea specifica.

Il problema con q() o quit() è che termina la sessione R, ma mi piacerebbe avere la sessione R ancora aperta.

Come @JoshuaUlrich proposto browser() può essere un'altra opzione, ma ancora non perfetta, perché la fonte termina in un nuovo ambiente (cioè la richiesta R cambierà a Browser[1]> anziché >). Ancora possiamo premere Q per chiuderlo, ma sto cercando il modo semplice.

Un'altra opzione è utilizzare if (! justUpdate) { main body } ma è risolvere il problema, non risolverlo.

C'è qualche opzione migliore?

+0

Potresti approfondire ciò che stai cercando di fare, e perché? Questo può aiutarci ad aiutarti. –

+0

@joran Non voglio chiudere tutti i messaggi di errore – Ali

+4

O 1) inserisci le tue definizioni di funzione in un file separato (o meglio ancora, un pacchetto) dal tuo programma e inizialo dopo aver aggiornato le funzioni ; oppure 2) usa 'if (! justUpdate) {...}'. Raccomando 1). Quello che vuoi fare al momento è un modo confuso di organizzare il tuo codice. –

risposta

6

Stai cercando la funzione browser.

+1

Grazie, 'browser' è una buona scelta ma non perfetta. Quando lo inserisco nel codice sorgente, il programma si ferma correttamente dalla riga che volevo, tuttavia il prompt viene modificato in "Browser [1]>" anziché ">" che significa nel nuovo ambiente. Voglio semplicemente lo stesso ambiente in cui la mia fonte era finita normalmente – Ali

+0

Basta digitare 'Q' a quel prompt per chiudere il prompt del browser e ritornare al prompt principale ... –

+0

@PaulHiemstra Grazie Ho aggiornato la domanda, hai qualche idea più conveniente ? – Ali

6

C'è una bella soluzione in una mailing list here che definisce una funzione che, in fondo stopQuietlynasconde l'errore indicato dalla funzione stop:

stopQuietly <- function(...) { 
    blankMsg <- sprintf("\r%s\r", paste(rep(" ", getOption("width")-1L), collapse=" ")); 
    stop(simpleError(blankMsg)); 
} # stopQuietly() 

> stopQuietly() 
+0

Questa soluzione è fantastica. Grazie! – drmariod

3

ho trovato una soluzione piuttosto ordinata here. Il trucco è disattivare tutti i messaggi di errore appena prima di chiamare stop(). La funzione on.exit() viene utilizzata per assicurarsi che i messaggi di errore vengano riattivati ​​in seguito. La funzione è simile al seguente:

stop_quietly <- function() { 
    opt <- options(show.error.messages = FALSE) 
    on.exit(options(opt)) 
    stop() 
} 

La prima linea si spegne i messaggi di errore e memorizza la vecchia impostazione per la variabile opt. Dopo questa riga, qualsiasi errore che si verifichi non produrrà un messaggio e pertanto, anche stop() non causerà la stampa di alcun messaggio.

Secondo l'aiuto R,

on.exit registra l'espressione data come argomento da dover essere eseguito quando la funzione termina attuali.

La funzione corrente è stop_quietly() e termina quando viene chiamato stop().Quindi l'ultima cosa che fa il programma è chiamare options(opt) che imposterà show.error.messages sul valore che aveva, prima che fosse chiamato stop_quietly() (presumibilmente, ma non necessariamente, TRUE).

2

Ho un problema simile e, in base alla risposta di @VangelisTasoulas, ho ottenuto una soluzione semplice.
All'interno delle funzioni, devo verificare se DB è aggiornato. Se non lo è, ferma l'esecuzione.

r=readline(prompt="Is DB updated?(y/n)") 
Is DB updated?(y/n)n 
if(r != 'y') stop('\r Update DB') 
Update DB 

Basta mettere \r all'inizio del messaggio, sovrascrivere Error: nel messaggio.

Problemi correlati