.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
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
@ Learner infatti è il link 3 della mia domanda – MichaelChirico
Vedi, inoltre, [questo riferimento] (https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Registering-native-routines) –