В чем преимущество импорта в пространстве имен в R? - PullRequest
29 голосов
/ 02 сентября 2011

Механизм пространства имен R позволяет export функциям, которые затем видны пользователю.Кроме того, он позволяет import функции из других пакетов.В то время как выгода от экспорта очевидна, у меня больше проблем с пониманием выгода от импорта.

Кажется, что одно преимущество заключается в том, что можно использовать функции из других пакетов, не подключая пакет и тем самым экономя память.Это проиллюстрировано в разделе 1.6.4 в письменном руководстве по расширениям R .

Однако должны быть и другие преимущества функции импорта.В частности, раздел 1.6.6 (который имеет дело с классами S4) показывает namespace пакета stats4:

 export(mle)
 importFrom("graphics", plot)
 importFrom("stats", optim, qchisq)
 ## For these, we define methods or (AIC, BIC, nobs) an implicit generic:
 importFrom("stats", AIC, BIC, coef, confint, logLik, nobs, profile,
            update, vcov)
 exportClasses(mle, profile.mle, summary.mle)
 ## All methods for imported generics:
 exportMethods(coef, confint, logLik, plot, profile, summary, show, update, vcov)
 ## implicit generics which do not have any methods here
 export(AIC, BIC, nobs)

Здесь есть импортированные функции, которые не являются ни классами S4, ни универсальными(где также имеет смысл использовать импорт, как описано в примере в этого раздела ), но функционирует как plot из пакета graphics, который автоматически загружается при запуске R.

Поэтому мой вопрос: в чем выгода импорта таких функций, как plot, optim или qchisq?

1 Ответ

23 голосов
/ 02 сентября 2011

Если функция foo импортируется из пакета Bar, то она обнаруживается независимо от того, что пользователь делает со своим путем поиска, например, путем присоединения пакета Baz, который также имеет функцию foo. Без пространства имен код пакета внезапно обнаружит себя с помощью Baz::foo. Есть также проблемы с эффективностью (foo обнаруживается сразу, а не после поиска по всем символам в пути поиска), но они, вероятно, будут тривиальными для большинства приложений. Точно так же, importFrom является улучшением по сравнению с import из-за меньшего количества коллизий (или использования непреднамеренных функций) и более эффективного поиска.

С S4 (и S3) все может быть довольно сложно. Неуниверсальная функция, такая как graphics::plot, может быть преобразована в универсальную (с setGeneric) в двух разных пакетах, и к каждому универсальному может быть прикреплен собственный набор методов. Автор пакета захочет уточнить, какой plot универсальный и, следовательно, какие методы отправляют таблицу, их классы и методы см.

Вызов функции с помощью pkg::foo всегда преобразуется в намеченную функцию. Это требует, чтобы pkg был указан в поле Depends: файла DESCRIPTION (возможно, в Imports: но тогда кажется, что вводящая в заблуждение реклама не импортирует из pkg), загрязняя путь поиска пользователя. Он также включает в себя поиск двух символов и вызов функции (::) и поэтому менее эффективен. Моя ленивая и не внимательная к деталям также считает использование :: утомительным и подверженным ошибкам.

Пакет codetoolsBioC (через svn с именем пользователя и паролем readonly) может генерировать файл NAMESPACE из существующего пакета (или, по крайней мере, он мог до того, как недавние изменения в R-devel представили NAMESPACE для пакетов без одного; я не пробовал codetoolsBioC на таком пакете).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...