Ho un wrapper per l'in-built warning()
funzione R che chiama in fondo warning(sprintf(...))
:R avvertimento() involucro - elevare alla funzione di genitore
warningf <- function(...)
warning(sprintf(...))
Questo è perché io uso warning(sprintf(...))
così spesso che ho deciso di fare una funzione fuori di esso (è in un pacchetto che ho delle funzioni che uso spesso).
Quindi utilizzo warningf
durante la scrittura di funzioni. vale a dire, invece di scrivere:
f <- function() {
# ... do stuff
warning(sprintf('I have %i bananas!',2))
# ... do stuff
}
scrivo:
f <- function() {
# ... do stuff
warningf('I have %i bananas!',2)
# ... do stuff
}
Se chiamo il primo f()
, ottengo:
Warning message:
In f() : I have 2 bananas!
Questo è un bene - mi dice dove l'avviso è venuto da f()
e cosa è andato storto.
Se chiamo il secondo f()
, ottengo:
Warning message:
In warningf("I have %i bananas!",2) : I have 2 bananas!
Questo non è l'ideale - mi dice l'avvertimento era in funzione warningf
(ovviamente, perché è la funzione warningf
che chiama warning
, non f
), mascherando il fatto che proveniva effettivamente dalla funzione f()
.
Quindi la mia domanda è: Posso in qualche modo "sollevare" la chiamata warning
in modo che venga visualizzato il messaggio warning in f()
anziché warning in warningf
?
@richiecotton grazie per la modifica. La tua strada è molto meglio. – Andrie
+1 - bella risposta. Ancora più semplice sarebbe usare semplicemente 'sys.call (-1)'. (Funziona b/c l'argomento 'which' su' sys.call() 'rappresenta" il numero di frame da tornare se negativo "). –
Fantastico! Ho pensato che potesse avere qualcosa a che fare con lo stack delle chiamate quando ho visto il codice 'warning', ma non sapevo come farlo. Grazie! –