我有一个使用tmPlot
中的treemap
函数的包,但是当我尝试使用该函数时,它会抛出一个错误,表明其中一个依赖项未加载:
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 <yourfault@somewhere.net>
Description: More about what it does (maybe more than one line)
License: What license is it under?
Imports:
treemap
Collate:
'maketree.R'
在R /文件夹中是一个名为'maketree.R'的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")
重新启动R(最好使用--vanilla)并执行以下操作:
library(anRpackage)
data(mtcars)
maketree(mtcars, "cyl", "mpg")
你应该从一开始就得到我所描述的错误。为什么会这样? RColorBrewer
被列为treemap
的取款,因此应该自动导入,如果不是的话?
答案 0 :(得分:10)
问题出在树图上。 treemap
使用brewer.pal
,Imports: RColorBrewer
和importFrom(RColorBrewer, brewer.pal)
也是如此。
现在看来,如果用户说library(treemap)
,树形图和RColorBrewer附加到search()
路径,并且评估tmPlot
brewer.pal
时,一切正常在搜索路径上找到。当然,如果用户说brewer.pal="yeast"
或其他东西,包会破坏,因为会找到错误的符号;这是名称空间的原因之一,可以保护树形图的功能不受用户的影响。
但是当你(正确地)进口时会发生什么:树形图? treemap被加载(到内存中)但是树形图及其依赖项都没有附加(到搜索路径)。所以找不到brewer.pal
。
如果树图是Imports:RColorBrewer,那么当树图通过调用library(treemap)
附加到搜索路径时,以及仅导入到您的包中时,都会找到brewer.pal。
联系treemap的维护者,让他们更仔细地构建他们的名字空间。
答案 1 :(得分:1)
在调用tmPlot(data, index = index, vSize = vSize)
之前,您需要加载RColorBrewer:
require(RColorBrewer)
答案 2 :(得分:0)
我认为这是因为您在Imports
文件中使用了Depends
而不是DESCRIPTION
。
如果您使用Depends: treemap
,则在加载程序包时会加载并附加treemap
程序包,因此也会加载treemap
个依赖项。
如果使用Imports: treemap
,则仅导入指定的命名空间,即您可以在函数中使用treemap
变量。但似乎在这种情况下不会加载treemap
依赖项。
所以我认为您应该使用Depends: treemap
(但似乎现在提升了Imports
的使用),或直接从您的包中导入RColorBrewer
。
很抱歉,不确定这是否真的能回答您的问题,您可能已经完全了解所有这些要点......