TmPlot находится в пространстве имен, но его зависимости не найдены

У меня есть пакет, который использует tmPlot функцию из treemap, но когда я пытаюсь использовать эту функцию, она выдает ошибку, в которой не загружена одна из его зависимостей:

Error in tmPlot(data, index = index, vSize = vSize) : 
  could not find function "brewer.pal"

Зависимость установлена ​​и в пространстве имен.

У этого вопроса есть немного настройки, являясь проблемой пакета, но я попытался сделать это как можно меньше:

Убедитесь, что у вас установлена ​​ treemap (и все ее зависимости).

Я создал каталог под названием "anRpackage". Внутри это папка ('R') и ​​файл DESCRIPTION со следующим текстом:

Package: anRpackage
Title: What the package does (short line)
Version: 1.0
Author: Who wrote it
Maintainer: Who to complain to <[email protected]>
Description: More about what it does (maybe more than one line)
License: What license is it under?
Imports:
    treemap
Collate:
    'maketree.R'

Внутри папки R/есть один R файл, называемый "maketree.R". Его содержимое:

#' maketree
#' 
#' @importFrom treemap tmPlot
#' @export maketree

maketree <-
function(data, index, vSize){
  tmPlot(data, index=index, vSize=vSize)
}

Предполагая, что вы находитесь в каталоге выше 'anRpackage', запустите следующий script:

library(roxygen2)
roxygenise("anRpackage/")

library(devtools)

build("anRpackage")
install("anRpackage")

Перезапустите R (желательно с --vanilla) и запустите следующее:

library(anRpackage)

data(mtcars)
maketree(mtcars, "cyl", "mpg")

Вы должны получить ошибку, описанную мной в начале. Почему это происходит? RColorBrewer указан как Depends для treemap, поэтому его следует автоматически импортировать, если это не так?

Ответ 1

Проблема действительно связана с treemap. treemap использует brewer.pal, и поэтому должен Imports: RColorBrewer и importFrom(RColorBrewer, brewer.pal).

Как сейчас, все в порядке, если пользователь говорит, что library(treemap), treemap и RColorBrewer прикреплены к пути search(), и когда tmPlot оценивается brewer.pal, находится на пути поиска. Конечно, пакет сломался бы, если бы пользователь сказал brewer.pal="yeast" или что-то еще, потому что был найден неправильный символ; это одна из причин пространства имен, чтобы защитить функции treemap от того, что может сделать пользователь.

Но что происходит, когда вы (правильно) Импорт: treemap? treemap загружается (в память), но ни treemap, ни его зависимости не привязаны (к пути поиска). Поэтому brewer.pal не найден.

Если treemap был импортирован: RColorBrewer, то brewer.pal будет найден как при подключении treemap к пути поиска вызовом library(treemap), так и при ввозе только в ваш пакет.

Обратитесь к хранителю treemap и попросите их сделать более тщательную работу по созданию своего пространства имен.

Ответ 2

перед вызовом tmPlot (data, index = index, vSize = vSize), вам необходимо загрузить RColorBrewer:

требуется (RColorBrewer)

Ответ 3

Я думаю, это связано с тем, что вы используете Imports вместо Depends в вашем файле DESCRIPTION.

Если вы используете Depends: treemap, пакет treemap загружается и присоединяется при загрузке вашего пакета, и поэтому также загружаются зависимости treemap.

Если вы используете Imports: treemap, тогда импортируется только указанное пространство имен, то есть вы можете использовать переменные treemap в ваших функциях. Но похоже, что в этом случае зависимости treemap не загружаются.

Поэтому я думаю, что вы должны использовать Depends: treemap (но кажется, что использование Imports продвигается в эти дни) или импортировать RColorBrewer непосредственно из вашего пакета.

Извините, не уверенный, что это действительно отвечает на ваш вопрос, и вы, возможно, уже прекрасно знаете обо всех этих моментах...