Метод R S3 не экспортируется из пространства имен

Почему у меня появляется это сообщение об ошибке:

> vegan::reorder.hclust
Error: 'reorder.hclust' is not an exported object from 'namespace:vegan'

Пока этот метод S3 вполне доступен. Например, если я наберу help(reorder.hclust, package = "vegan"), я получу нужную страницу справки, а vegan:::reorder.hclust отобразит исходный код функции на консоли...
Также файл NAMESPACE моей установки vegan содержит S3method(reorder, hclust).

Я хотел бы использовать эту функцию в другом пакете, если мне нужно ее импортировать или использовать vegan::reorder.hclust

> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.4 LTS

Matrix products: default
BLAS: /usr/lib/libblas/libblas.so.3.6.0
LAPACK: /usr/lib/lapack/liblapack.so.3.6.0

locale:
 [1] LC_CTYPE=fr_BE.UTF-8       LC_NUMERIC=C               LC_TIME=fr_BE.UTF-8       
 [4] LC_COLLATE=fr_BE.UTF-8     LC_MONETARY=fr_BE.UTF-8    LC_MESSAGES=fr_BE.UTF-8   
 [7] LC_PAPER=fr_BE.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=fr_BE.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] MASS_7.3-49     compiler_3.4.3  Matrix_1.2-11   parallel_3.4.3  tools_3.4.3    
 [6] mgcv_1.8-23     yaml_2.1.18     nlme_3.1-131.1  grid_3.4.3      permute_0.9-4  
[11] vegan_2.4-6     cluster_2.0.6   lattice_0.20-35

person Gilles    schedule 16.03.2018    source источник
comment
Это в основном то же самое, что и stackoverflow.com/ вопросы/15563640/   -  person RolandASc    schedule 16.03.2018
comment
Да, ты прав. Мне не удалось найти этот...   -  person Gilles    schedule 16.03.2018


Ответы (1)


Вы получаете эту ошибку, потому что vegan не экспортирует эту функцию. Это может помочь для вещей, которые не экспортируются. С помощью трех двоеточий vegan:::reorder.hclust отображает внутренние функции, которые не экспортируются; обычно вам следует избегать их использования.

Однако при загрузке пакета vegan его функция reorder.hclust будет добавлена ​​в таблицу методов для reorder. Поэтому вам просто нужно убедиться, что он загружен, а затем, если hc является объектом hclust, reorder(hc) вызовет метод reorder.hclust. Вы можете сделать это, вставив requireNamespace("vegan") в свой код или импортировав что-то из vegan в файл NAMESPACE.

Если есть два метода reorder.hclust (определяемые разными загруженными пакетами), то я не думаю, что у вас есть простой способ указать vegan, кроме использования vegan:::reorder.hclust, против чего CRAN будет возражать. Вам нужно будет попросить сопровождающего vegan экспортировать их функцию, чтобы вы могли получить к ней доступ, используя легальный vegan::reorder.hclust, или скопировать код в свой собственный пакет, или каким-либо другим неудобным способом.

person user2554330    schedule 16.03.2018
comment
utils::getFromNamespace("reorder.hclust", "vegan") — это один из подходов к использованию функции и прохождению теста CRAN. - person missuse; 16.03.2018
comment
Документы предостерегают от использования getFromNamespace: не следует использовать в рабочем коде. Так что CRAN может добавить это в свои тесты позже. - person user2554330; 16.03.2018
comment
Спасибо за ответ ! Что-то я не понимаю: разве S3method(reorder, hclust) это не способ экспортировать его из веганского (это в файле NAMESPACE пакета)? - person Gilles; 16.03.2018
comment
Подводя итог: 3 решения на данный момент: 1) связаться с веганским разработчиком, чтобы попросить его экспортировать функцию (но как, если S3method(reorder, hclust) не подходит для этого?), 2) скопировать код в моем пакете (не очень приятно - это то, что я делаю на данный момент) 3) в соответствии с ответом на аналогичный вопрос, указанный @RolandASc: добавьте Depends: vegan в ОПИСАНИЕ моего пакета, чтобы принудительно подключить этот пакет (тоже не очень приятно). И, возможно, также (используйте utils::getFromNamespace("reorder.hclust", "vegan"), но это не рекомендуется. - person Gilles; 16.03.2018
comment
vegan экспортирует эту функцию, но вы использовали ее неправильно. Если у вас есть функция метода, такая как reorder.hclust, вы должны использовать ее как reorder(<hclust.object>), но она не будет работать при использовании как reorder.hclust(<any.object>). Это справедливо и для любой другой функции метода веганского S3: например, plot.cca(<cca.result>) не сработает, а plot(<cca.result>) сработает. - person Jari Oksanen; 16.03.2018
comment
R имеет довольно сложную модель для определения области видимости. Объявление S3method в NAMESPACE только добавляет этот метод в таблицу методов reorder, что не равносильно его экспорту. Код вне vegan не может видеть функцию, если он не использует ::: или getFromNamespace, или код не является универсальным, использующим эту таблицу методов. - person user2554330; 16.03.2018
comment
Спасибо за ваши дополнительные комментарии. @Jari Oksanen: я использую эти reorder методы для hclust объектов, как вы рекомендуете, в течение многих лет (кстати, спасибо за эту очень полезную функцию, которую вы разработали, которая действительно должна быть в базе R ...). Теперь, когда я хочу встроить свои функции в пакет, я изо всех сил пытаюсь импортировать метод reorder.hclust в свой пакет... Поэтому я пробовал разные возможности. В противном случае я не понимаю, как я могу импортировать эту функцию. Я также не понимаю, почему код S3method(reorder, hclust), который вы использовали в NAMESPACE, кажется недостаточным, чтобы позволить мне его импортировать. - person Gilles; 16.03.2018
comment
Почему бы не назвать его так, как мы с Яри предложили, то есть как reorder(hc)? - person user2554330; 16.03.2018
comment
@ user2554330: Кажется, невозможно использовать reorder(hc) в моем пакете, если я не присоединю весь пакет vegan либо явным вызовом library(vegan) в коде моего пакета (что я и делаю в локальном сценарии R), либо добавив Depends: vegan в ОПИСАНИЕ моего пакета. Я читал, что при разработке пакетов обычно не рекомендуется прикреплять весь внешний пакет (например, потому что это изменяет путь поиска пользователя и увеличивает риск конфликтов). - person Gilles; 16.03.2018
comment
Как насчет предложений в моем ответе, requireNamespace или импорта чего-то из vegan? Кстати, вы также должны посмотреть на функцию getS3method, которая, вероятно, делает то, что вы хотите. - person user2554330; 16.03.2018
comment
Добавление requireNamespace(vegan, quitely = TRUE) в мою функцию package package, тогда reorder(hcl_object) действительно работает! Он загружает пакет, не прикрепляя его (как сделал бы vegan::reorder, если бы он работал и если бы я хорошо понимал, как все это работает). Я безуспешно пытался импортировать изvegan в мой файл NAMESPACE (например, importFrom("vegan", "reorder.hclust"))... getS3method работает только в том случае, если веганский прикреплен, но не в том случае, если он только загружен! Еще раз спасибо за вашу помощь и терпение! - person Gilles; 17.03.2018
comment
Всего два уточнения: запись с двумя точками не приводит к тому, что пакет прикрепляется, а только загружается. Он работает только с функциями, экспортированными из пакета. Таким образом, vegan::vegdist вызовет загрузку пакета, если он установлен. Точно так же importFrom("vegan", "vegdist") будет работать, чтобы загрузить его, но вы не можете импортировать что-то вроде reorder.hclust, потому что оно не было экспортировано. - person user2554330; 18.03.2018
comment
Я готовлю новый веганский релиз на следующей неделе. Я могу экспортировать reorder.hclust, если у вас есть серьезная потребность и вы считаете, что это лучший способ. Какая у вас потребность? - person Jari Oksanen; 28.03.2018