Ответ 1
Если функция foo
импортируется из панели пакетов, то она найдена независимо от того, что пользователь делает для своего пути поиска, например, путем присоединения пакета Baz, который также имеет функцию foo
. Без пространства имен код пакета неожиданно обнаружил бы с помощью Baz::foo
. Существуют также проблемы с эффективностью (foo
найден сразу, а не после поиска по всем символам на пути поиска), но они могут быть тривиальными для большинства приложений. Точно так же importFrom
является улучшением по сравнению с import
из-за меньшего количества коллизий (или использования непреднамеренных функций) и более эффективного поиска.
С S4 (и S3) все может стать довольно сложным. Ненулезную функцию, такую как graphics::plot
, можно повысить до общего (с setGeneric
) в двух разных пакетах, и каждый родословный может иметь свой собственный набор методов. Автор пакета захочет быть точным, о чем plot
generic, и, следовательно, какие методы рассылают таблицу, их классы и методы видят.
Вызов функции с помощью pkg::foo
всегда разрешает предполагаемую функцию. Это требует, чтобы pkg был указан в поле Depends: файла DESCRIPTION (возможно, в Imports: но тогда это похоже на вводящую в заблуждение рекламу, чтобы не импортировать из pkg), загрязняя путь поиска пользователя. Он также включает в себя два символьных вида и вызов функции (::
), и поэтому он менее эффективен. Ленькая и невнимательная часть меня также рассматривает использование ::
как утомительного и подверженного ошибкам.
Пакет codetoolsBioC (через svn с именем пользователя и паролем readonly
) может сгенерировать файл NAMESPACE из существующего пакета (или в по крайней мере, до недавних изменений в R-devel ввел NAMESPACE на пакеты без одного, я не пробовал codetoolsBioC на таком пакете).