【问题标题】:tmPlot is in namespace, but its dependencies are not foundtmPlot 在命名空间中,但未找到其依赖项
【发布时间】:2023-03-20 15:22:02
【问题描述】:

我有一个使用来自treemaptmPlot 函数的包,但是当我尝试使用该函数时,它会抛出一个错误,即它的依赖项之一未加载:

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,所以它应该是自动导入的,不是吗?

【问题讨论】:

  • 尝试添加import RColorBrewertreemap 可能不会自动加载此包,或者它可能会自动加载,但仅调用树图中的一个函数不会调用 RColorBrewer
  • @TylerRinker 这并不是我想要解决这个问题(通过在函数中添加library(treemap) 可以很容易地解决这个问题)。更重要的是,我想知道为什么这个问题会在这里发生,而根据我的理解,它不应该发生。我不明白为什么有些包需要手动加载而不是其他包。

标签: r namespaces treemap


【解决方案1】:

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

require(RColorBrewer)

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 解释得很好。我需要就这个请求联系几个包维护者,并想知道是否有规范文档可以指向他们——在 R 文档、CRAN 网站或 R-devel list-serve 中特别好的东西。现在我可能只使用你的答案。谢谢。
    • 同意,很好的解释+1
    • 那么主要问题是他们使用 Depends 而不是 Imports 或者他们的 NAMESPACE 缺少适当的语句?
    • @sebastian-c 对于这个特定问题,treemap 应该使用 Imports: RColorBrewer in DESCRIPTION (并且可能不依赖于:RColorBrewer -- treemap 最终用户不需要直接使用 RColorBrewer 函数),并且将 importFrom(RColorBrewer, brewer.pal) 添加到他们的 NAMESPACE。快速浏览一下,应该导入额外的包/符号。
    • @MartinMorgan 我联系了包的作者,他告诉我这将在下一个版本中修复。
    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-29
      • 2012-10-16
      • 2011-09-03
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 2019-11-20
      相关资源
      最近更新 更多