2013-02-11 2 views
6

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

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

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

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

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

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

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', запустите следующий сценарий:

library(roxygen2) 
roxygenise("anRpackage/") 

library(devtools) 

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

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

library(anRpackage) 

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

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

+0

Попробуйте добавить 'импорт RColorBrewer'. Этот пакет не может быть загружен автоматически 'treemap', или, может быть, он делает это, но вызов только одной функции из древовидной карты не вызывает' RColorBrewer'. –

+1

@TylerRinker Это не так, что я хочу исправить проблему (проблему можно легко устранить, добавив в библиотеку 'library (treemap)'). Более того, я хочу знать, почему эта проблема происходит здесь, когда, по моему мнению, этого не должно произойти. Я не понимаю, почему некоторые пакеты нужно загружать вручную, а не другие. –

ответ

10

Проблемы действительно с 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

Очень красиво объяснено. Мне нужно связаться с несколькими сопровождающими пакетами только с этим запросом и задаться вопросом, есть ли канонический документ, чтобы указать на них - что-то особенно хорошее в документах R, на веб-сайте CRAN или в списке R-devel. Теперь я могу просто использовать ваш ответ. Благодарю. –

+0

Согласовано, славное объяснение +1 –

+0

. Главная проблема, которую они используют, зависит от импорта, или что их NAMESPACE не хватает соответствующих утверждений? –

0

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

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

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

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

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

1

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

требуют (RColorBrewer)

Смежные вопросы