2014-07-09 12 views
6

Quando si crea un pacchetto R, esistono almeno due alternative per il riferimento alle funzioni nei pacchetti importati.Come devo fare riferimento alle funzioni nei pacchetti importati?

entrambi i casi,

  1. esplicitamente il nome della funzione utilizzando l'operatore due punti doppio ogni volta che si voglia chiamare, package::function.

  2. Aggiungi importFrom(package, function) al file NAMESPACE, direttamente o tramite un tag di roxy #' @importFrom package function.

Quali sono i vantaggi e gli svantaggi di ciascun metodo?

Esistono differenze tecniche in ciò che ciascuna sintassi raggiunge?

+0

I due punti doppi possono fare riferimento solo alle funzioni esportate. Devi usare il triplo punto altrimenti. – James

+2

@James Vero, ma non dovresti accedere alle funzioni non esportate dai pacchetti di altre persone, poiché l'API potrebbe modificare e infrangere il tuo codice. –

+0

Capricciosamente: penso che 'importFrom' importa la funzione quando si carica il pacchetto, ma' :: 'esegue una ricerca in fase di esecuzione, quindi' importFrom' renderà il caricamento più lungo del pacchetto, ma '::' renderà il vostro il codice funziona più lentamente. Sospetto che sia solo la differenza di microsecondi in ogni caso. –

risposta

6

Gli argomenti a favore dell'utilizzo di package::function

Lo rende del tutto chiaro dove la funzione è venuto da.

Gli argomenti a favore dell'utilizzo di @importFrom package function

Si tratta di meno di battitura, in particolare quando una funzione viene utilizzata molte volte da vostro pacchetto.

Poiché è necessario cercare il pacchetto e una chiamata alla funzione ::, package::function ha una piccola penalità di prestazioni in fase di esecuzione. Vedi https://stackoverflow.com/a/7283511/134830.

A conti fatti, qual è il verdetto?

Entrambi i metodi fanno il lavoro e gli argomenti in entrambi i casi non sono schiaccianti, quindi non perdere il sonno. Basta scegliere un metodo e attenersi ad esso.

La politica che è stata adottata nel mio luogo di lavoro è che per alcuni pacchetti comunemente utilizzati, i tag di roulette @importFrom devono essere utilizzati. Ad esempio, gli sviluppatori devono sapere che ddply proviene da plyr o che le funzioni che iniziano con str_ provengono da stringr. In questo caso, la parentela esplicita della funzione non è così utile da sapere. Per le funzioni al di fuori di questo elenco principale (o se c'è qualche ambiguità), è necessario utilizzare :: per rendere chiaro da dove proviene.

Problemi correlati