Інша проблема, при наявності NAMESPACE, полягає в тому, що ви намагаєтеся запустити не експортовану функцію з пакета foo .
Наприклад (надумано, я знаю, але):
> mod <- prcomp(USArrests, scale = TRUE)
> plot.prcomp(mod)
Error: could not find function "plot.prcomp"
По-перше, ви не повинні викликати методи S3 безпосередньо, але припускаємо, що plot.prcomp
насправді була якась корисна внутрішня функція в пакеті foo . Для виклику такої функції, якщо ви знаєте, що ви робите, потрібно використовувати :::
. Вам також потрібно знати простір імен, в якому знайдена функція. Використовуючи, getAnywhere()
ми виявляємо, що функція знаходиться в статистиці пакета :
> 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 повертає значення внутрішньої назви змінної.