tmPlot在命名空间中,但找不到它的依赖项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 <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,所以应该自动导入,如果不是?

答案

问题实际上是树形图。 treemap使用brewer.palImports: RColorBrewerimportFrom(RColorBrewer, brewer.pal)也应如此。

现在看来,如果用户说library(treemap),treemap和RColorBrewer附加到search()路径,并且当tmPlot被评估时brewer.pal被发现在搜索路径上,一切都很好。当然,如果用户说brewer.pal="yeast"或其他东西,包将会破坏,因为会找到错误的符号;这是名称空间的原因之一,用于保护树形图的功能不受用户可能执行的操作。

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

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

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

另一答案

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

require(RColorBrewer)
另一答案

我认为这是因为你在Imports文件中使用Depends而不是DESCRIPTION

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

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

所以我认为你应该使用Depends: treemap(但似乎这些天使用Imports),或直接从你的包中导入RColorBrewer

对不起,不确定这真的回答了你的问题,你可能已经完全了解所有这些要点......

以上是关于tmPlot在命名空间中,但找不到它的依赖项的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Composer 作为依赖项(PSR-0)的情况下使用具有命名空间的 PHP 库?

asp.net提示“未能加载文件或程序集“XXXXXXXX.dll”或它的某一个依赖项。找不到指定的模块。”

第三方 dll 在 ASP.NET MVC 项目中找不到它的依赖项

如何处理将作为另一个包的依赖项的命名空间包

如何使用没有Composer作为依赖项的命名空间的PHP库(PSR-0)?

未能加载文件或程序集“SharpSvn.dll”或它的某一个依赖项。找不到指定的模块。