6

我有一个使用tmPlotfrom 函数的包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被列为 Depends for treemap,所以它应该是自动导入的,不是吗?

4

3 回答 3

10

问题确实出在树形图上。treemap使用brewer.pal, 应该Imports: RColorBrewerimportFrom(RColorBrewer, brewer.pal).

就目前而言,如果用户说library(treemap),treemap 和 RColorBrewer 附加到search()路径,并且在搜索路径上找到tmPlot评估时,一切正常。brewer.pal当然,如果用户说brewer.pal="yeast"什么的话,包装会损坏,因为会发现错误的符号;这是名称空间的原因之一,以保护树形图的功能免受用户可能做的事情。

但是当你(正确地) Imports: treemap 时会发生什么?树图已加载(到内存中),但树图及其依赖项均未附加(到搜索路径)。所以brewer.pal没有找到。

如果树图是 Imports: RColorBrewer,那么当树图通过调用附加到搜索路径library(treemap)时,以及仅导入到您的包中时,都会找到 brewer.pal。

联系 treemap 的维护者,要求他们更仔细地构建他们的命名空间。

于 2013-02-11T13:33:40.560 回答
1

在调用之前tmPlot(data, index = index, vSize = vSize),您需要加载 RColorBrewer:

require(RColorBrewer)
于 2013-10-02T03:40:25.303 回答
0

我认为这是由于您使用Imports而不是DependsDESCRIPTION文件中。

如果使用Depends: treemap,则在treemap 加载包时会加载并附加包,因此treemap也会加载依赖项。

如果使用Imports: treemap,则仅导入指定的命名空间,即您可以treemap在函数中使用变量。但似乎在这种情况下treemap没有加载依赖项。

所以我认为你应该要么使用Depends: treemap(但现在似乎在推广使用),或者直接从你的包中Imports导入。RColorBrewer

抱歉,不确定这是否真的回答了您的问题,您可能已经完全了解所有这些要点......

于 2013-02-11T12:46:35.157 回答