2

我正在尝试为包提供一些可选的、方便的功能,foo但我与依赖项的依赖关系作斗争。具体来说,如果安装了 bioconductor KEGGgraph-package ,我想使用它的一些功能。本身取决于-package。从我读到的(虽然不清楚)是按照建议包括(和?)。KEGGgraphgraphKEGGgraphgraph

文档中,我看到requireNamespace现在鼓励使用 of::而不是require内部函数。事实上,如果使用包裹检查也会抱怨require。但是,当我使用requireNamespace并且找不到::依赖项时。KEGGgraph

考虑以下最小的可重现示例。已安装和KEGGgraph全新的 R-session。graph下面的函数在-package中找不到函数:

# If KEGGgraph is not installed:
#source("http://bioconductor.org/biocLite.R")
#biocLite("KEGGgraph")

convenientFunction <- function() {
  if (requireNamespace("KEGGgraph")) {
    tmp.file <- paste0(tempfile(), ".kgml")
    kgml <- KEGGgraph::retrieveKGML("hsa:04115", organism = "hsa",
                                    destfile = tmp.file, method = "internal")
    return(KEGGgraph::parseKGML2DataFrame(tmp.file))
  } else {
    stop("This function needs KEGGgraph and its dependencies")
  }
}

convenientFunction()
#Loading required namespace: KEGGgraph
#trying URL 'http://www.genome.jp/kegg-bin/download?entry=hsa04115&format=kgml'
#Content type 'text/xml' length unknown
#opened URL
#.......... .......... ......
#downloaded 26 KB
#
# Error in nodeDataDefaults(gR, "KEGGNode") <- env.node : 
#  could not find function "nodeDataDefaults<-"

好像requireNamespace什么都不做。通过运行重现错误:

# In a new R-session...
requireNamespace("KEGGgraph") # With and without this line
tmp.file <- paste0(tempfile(), ".kgml")
kgml <- KEGGgraph::retrieveKGML("hsa:04115", organism = "hsa",
                                destfile = tmp.file, method = "internal")
KEGGgraph::parseKGML2DataFrame(tmp.file)

如果require("KEGGgraph")已被调用,则可以正常工作:

require("KEGGgraph")
res <- convenientFunction()

用户真的有必要require手动安装这个可选包吗?在函数定义中添加&& requireNamespace("graph")-conditionif似乎没有帮助。

4

2 回答 2

3

这是 KEGGgraph 的一个问题——它使用但不导入 graph::nodeDataDefaults<-。解决方案是联系maintainer("KEGGgraph")并要求他们更新他们的 NAMESPACE

KEGGgraph$ svn diff
Index: NAMESPACE
===================================================================
--- NAMESPACE   (revision 104133)
+++ NAMESPACE   (working copy)
@@ -2,7 +2,7 @@

 importFrom(XML, "xmlAttrs", "xmlChildren", "xmlName", "xmlRoot", "xmlTreeParse")

-importFrom(graph, "edges", "nodes<-", "nodes", "edgeData")
+importFrom(graph, "edges", "nodes<-", "nodes", "edgeData", "nodeDataDefaults<-")

 exportPattern("^[^\\.]")
 exportMethods("getDisplayName",

似乎可能还有其他缺失的导入,严厉的解决方案是简单地import(graph); 一个较轻但不完美的方法是使用codetoolsBioC ::writeNamespaceImports()来生成导入(这个函数有问题,所以不能 100% 依赖)。

解决方法是说library(graph)Depends: graph在您的包裹中;这会将图形放在search()路径上,并且 KEGGgraph 会在那里找到丢失的导入(这就是 KEGGgraph 本身起作用的原因 - 它取决于:在图形上,所以在搜索路径上找到丢失的导入;当你requireNamespace(),你不添加 KEGGgraph取决于:包到搜索路径,所以nodeDataDefaults<- 没有找到)。

于 2015-05-25T01:42:54.260 回答
3

我是 KEGGgraph 的维护者。我确认问题并更新了软件包。在 Bioconductor 颠覆存储库修订版 103436 中,该问题已得到解决并有望得到解决。

解决方案几乎就像 Martin 建议的那样,从图形包中显式导入函数。我也借此机会更改了KEGGgraph的依赖策略,以便导入图形包而不是依赖。希望这使 KEGGgraph 对上述用例更加友好。

感谢您报告该问题,并感谢 Martin 和 Dirk 的回答。

于 2015-05-25T09:04:06.787 回答