Otro problema, en presencia de un NAMESPACE, es que está intentando ejecutar una función no exportada desde el paquete foo .
Por ejemplo (artificial, lo sé, pero):
> mod <- prcomp(USArrests, scale = TRUE)
> plot.prcomp(mod)
Error: could not find function "plot.prcomp"
En primer lugar, no debería llamar a los métodos S3 directamente, pero supongamos que en plot.prcomp
realidad era una función interna útil en el paquete foo . Llamar a dicha función si sabe lo que está haciendo requiere el uso de :::
. También necesita saber el espacio de nombres en el que se encuentra la función. Usando getAnywhere()
encontramos que la función está en las estadísticas del paquete :
> getAnywhere(plot.prcomp)
A single object matching ‘plot.prcomp’ was found
It was found in the following places
registered S3 method for plot from namespace stats
namespace:stats
with value
function (x, main = deparse(substitute(x)), ...)
screeplot.default(x, main = main, ...)
<environment: namespace:stats>
Entonces ahora podemos llamarlo directamente usando:
> stats:::plot.prcomp(mod)
Lo he usado plot.prcomp
solo como ejemplo para ilustrar el propósito. En uso normal, no debería llamar a métodos S3 como este. Pero como dije, si la función a la que desea llamar existe (podría ser una función de utilidad oculta, por ejemplo), pero está en una namespace
, R informará que no puede encontrar la función a menos que le indique en qué espacio de nombres buscar .
Compare esto con lo siguiente:
stats::plot.prcomp
Lo anterior falla porque, mientras lo stats
usa plot.prcomp
, no se exporta stats
como el error nos dice correctamente:
Error: 'plot.prcomp' no es un objeto exportado de 'namespace: stats'
Esto se documenta de la siguiente manera:
pkg :: name devuelve el valor del nombre de la variable exportada en el espacio de nombres pkg, mientras que pkg ::: name devuelve el valor del nombre de la variable interna.