Другая проблема в присутствии NAMESPACE заключается в том, что вы пытаетесь запустить неэкспортированную функцию из пакета foo .
Например (надуманный, я знаю, но):
> mod <- prcomp(USArrests, scale = TRUE)
> plot.prcomp(mod)
Error: could not find function "plot.prcomp"
Во-первых, вы не должны вызывать методы S3 напрямую, но давайте предположим, что plot.prcomp
на самом деле была некоторой полезной внутренней функцией в пакете foo . Для вызова такой функции, если вы знаете, что делаете, требуется использовать :::
. Вам также необходимо знать пространство имен, в котором находится функция. Используя getAnywhere()
, мы находим, что функция находится в пакете stats :
> 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>
Так что теперь мы можем вызвать его напрямую, используя:
> stats:::plot.prcomp(mod)
Я использовал plot.prcomp
просто в качестве примера, чтобы проиллюстрировать цель. При обычном использовании вы не должны вызывать такие методы S3. Но, как я уже сказал, если функция, которую вы хотите вызвать, существует (например, это может быть скрытая служебная функция), но находится в namespace
, R сообщит, что не может найти функцию, если вы не скажете ей, какое пространство имен заглянуть внутрь.
Сравните это со следующим:
stats::plot.prcomp
Вышеприведенное не помогает, потому что stats
использует plot.prcomp
, но не экспортируется из stats
, как правильно говорит нам ошибка:
Ошибка: 'plot.prcomp' не является экспортированным объектом из 'пространства имен: статистика'
Это задокументировано следующим образом:
pkg :: name возвращает значение имени экспортируемой переменной в пространстве имен pkg, тогда как pkg ::: name возвращает значение имени внутренней переменной.