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
непосредственно из вашего пакета.
Извините, не уверенный, что это действительно отвечает на ваш вопрос, и вы, возможно, уже прекрасно знаете обо всех этих моментах...