2016-07-18 132 views
8

.Call sembra piuttosto scarsamente documentato; ?.Call dà una spiegazione dell'argomento PACKAGE:Come funziona l'argomento PACKAGE su .Call?

PACKAGE: se fornito, limitare la ricerca di una stringa di caratteri .NAME alla DLL dato da questo argomento (più l'estensione convenzionale, '.so', 'dll' , ...).

Questo argomento segue ... e pertanto il suo nome non può essere abbreviato.

Ciò ha lo scopo di aggiungere sicurezza per i pacchetti, che può garantire utilizzando questo argomento che nessun altro pacchetto può sovrascrivere i simboli esterni e inoltre velocizza la ricerca (vedere 'Note').

E nella Nota:

Se una di queste funzioni deve essere utilizzato di frequente, è necessario specificare PACKAGE (per limitare la ricerca a una singola DLL) o passare .NAME come uno dei simboli nativo oggetti. La ricerca di simboli può richiedere molto tempo, soprattutto quando vengono caricati molti spazi dei nomi.

È possibile vedere PACKAGE = "base" per i simboli collegati in R. Non utilizzare questo nel proprio codice: tali simboli non fanno parte dell'API e possono essere modificati senza preavviso.

PACKAGE = "" usato per essere accettato (ma non documentato): ora è un errore.

Ma non ci sono esempi di utilizzo.

Non è chiaro come funzioni l'argomento PACKAGE. Ad esempio, nel rispondere this domanda, ho pensato che la seguente dovrebbe hanno lavorato, ma non è così:

.Call(C_BinCount, x, breaks, TRUE, TRUE, PACKAGE = "graphics") 

Invece questo funziona:

.Call(graphics:::C_BinCount, x, breaks, TRUE, TRUE) 

È questo semplicemente perché è C_BinCount quali no? Ad esempio, se il codice interno di hist.default avesse aggiunto PACKAGE = "graphics", ciò avrebbe funzionato?

Questo sembra semplice ma è davvero raro trovare l'uso di questo argomento; nessuna delle fonti che ho trovato dare più di passaggio menzione (1, 2, 3, 4, 5) ... Gli esempi di questo in realtà di lavoro sarebbe apprezzato (anche se è solo citando il codice trovato in un pacchetto esistente)

(per scopi di auto-contenimento, se non si desidera copiare-incollare il codice da altra domanda, qui ci sono x e breaks):

x = runif(100000000, 2.5, 2.6) 
nB <- 99 
delt <- 3/nB 
fuzz <- 1e-7 * c(-delt, rep.int(delt, nB)) 
breaks <- seq(0, 3, by = delt) + fuzz 
+0

bella domanda, ho cercato su Google, ho trovato qualcosa che può darti alcuni suggerimenti nel caso in cui nessuno abbia esperienza http://www.biostat.jhsph.edu/~bcaffo/statcomp/files/dotCall.pdf – Learner

+1

@ Learner infatti è il link 3 della mia domanda – MichaelChirico

+1

Vedi, inoltre, [questo riferimento] (https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Registering-native-routines) –

risposta

10

C_BinCount è un oggetto della classe "NativeSymbolInfo", piuttosto che un stringa di caratteri che nomina una funzione di livello C, quindi PACCHETTO (che "confinano (s) th e cercare una stringa di caratteri .NOME ") non è rilevante. C_BinCount è reso un simbolo dalla sua menzione in useDynLib() nel pacchetto di grafica NAMESPACE.

come simbolo R, risoluzione C_BinCount s' è soggetta alle stesse regole degli altri simboli - non è esportato dallo spazio dei nomi, in modo che solo accessibile tramite graphics:::C_BinCount. E anche, per questo motivo, off-limits per uno sviluppo robusto del codice. Poiché il punto di ingresso C è importato come simbolo, è non disponibile come stringa di caratteri, quindi .Call("C_BinCount", ...) non funzionerà.

L'utilizzo di un oggetto NativeSymbolInfo indica a R dove si trova il codice C, quindi non è necessario farlo di nuovo tramite PACCHETTO; la scelta di usare il simbolo piuttosto che la stringa di caratteri è fatta dallo sviluppatore del pacchetto, e penso che sarebbe generalmente considerata una buona pratica. Molti pacchetti sviluppati prima dell'invenzione di NativeSymbolInfo usano l'argomento PACKAGE, se grep l'albero dei sorgenti del Bioconductor ci sono 4379 linee con .Call. * PACKAGE, ad es. here.

Ulteriori informazioni, inclusi esempi, si trovano nella sezione di scrittura R estensioni 1.5.4.

+0

Parlare di documentazione astrusa ... Ho provato '.Call (" C_BinCount ", x, breaks, TRUE, TRUE, PACKAGE =" graphics ")' e ho ottenuto un errore differente ('" C_BinCount "' non disponibile per '.Call() 'for package' "graphics" ') ... è questo perché non viene esportato? Non c'è modo di usare l'argomento 'PACKAGE' qui per eseguire la chiamata? – MichaelChirico

+0

Inoltre, conosci qualche codice _actual_ R che usa l'argomento 'PACKAGE'? Sarebbe utile trovare un esempio di questo "allo stato selvatico" – MichaelChirico

+0

Ho aggiornato la mia risposta: l'autore del pacchetto ha scelto di non esporre il simbolo tramite una stringa di caratteri, quindi nessuna quantità di digitazione renderà "C_BinCount" funzionante. Ci sono molti esempi in natura; Ho collegato a uno. –