2013-03-05 21 views
6

Sto provando a verificare se una particolare variabile o funzione esiste in un pacchetto. Ad esempio, supponiamo di voler verificare se una funzione denominata plot esistesse nel pacchetto "graphics".Verificare se una variabile/funzione esiste in un pacchetto?

I seguenti test se esiste una funzione plot, ma non quello che il pacchetto viene da:

exists('plot', mode='function') 

o posso provare che qualcosa chiamato plot esiste nel pacchetto graphics, ma questo non mi dice se si tratta di una funzione:

'plot' %in% ls('package:graphics') 

c'è un bel modo per chiedere "non un oggetto chiamato X esiste nel pacchetto di Y di modalità Z"? (In sostanza, posso limitare exists ad un particolare pacchetto?)

(Sì, posso combinare queste due linee al primo test che plot è in graphics e poi chiedere per la modalità di plot, ma cosa succede se ho avuto ? la mia funzione di mascheramento plotgraphics::plot Potrei quindi fidarsi l'uscita di exists('plot', mode='function'))

Background: scrittura dei test per un pacchetto di mine e vogliono mettere alla prova che le varie funzioni vengono esportate. Sto usando il pacchetto testthat che esegue i test in un ambiente in cui posso vedere tutte le funzioni interne del pacchetto e sono stato punto da exists('myfunction', mode='function') restituendo true, ma in realtà ho dimenticato di esportare myfunction. Voglio verificare che varie funzioni sono esportate.

+0

Questo è in relazione con questo [domanda] (http://stackoverflow.com/ domande/14430728/find-funzioni-con argomenti specifici/14430885 # 14430885) – agstudy

risposta

5
environment(plot) 
<environment: namespace:graphics> 

find('+') 
#[1] "package:base" 

find('plot') 
#[1] "package:graphics" 

find('plot', mode="function") 
#[1] "package:graphics" 
+1

Qui l'ambiente è un po 'arido - questo è l'ambiente in cui è stato creato il 'plot', non dove è stato trovato. – hadley

+0

Immagino che sarebbe una falsa pista nel caso in cui una funzione sia generica come sicuramente è qui. Se non fosse generico, non direbbe all'utente dove dovrebbe essere cercata la prima chiamata? –

+0

Si noti che l'ambiente di 'plot' è' namespace: graphics' ma si trova in 'package: graphics' - quelli sono ambienti diversi. Ulteriori dettagli sono disponibili in https://github.com/hadley/devtools/wiki/environments (ricerca di ambienti di funzioni) – hadley

7

Oh, l'ho trovato.

Ho notato che in ?ls si dice che il primo argomento ('package:graphics' per me) conta anche come ambiente. exists 'where argomento ha la stessa documentazione ls' name argomento, così ho indovinato 'package:graphics' potrebbe funzionare anche lì:

exists('plot', where='package:graphics', mode='function') 
[1] TRUE # huzzah! 
+1

+1 ma questo non funziona per la funzione interna. ** ::: **, cioè 'exists ('parse_formula', dove = 'pacchetto: reshape2', mode = 'function')' – agstudy

+2

'getFromNamespace ('parse_formula', ns = 'reshape2')' –

+0

Sì, I in particolare non voglio le funzioni interne ... oh, vedo che ho detto "esiste" nella mia domanda, intendevo "esportazioni"! oops –

Problemi correlati