我正在尝试为包提供一些可选的、方便的功能,foo
但我与依赖项的依赖关系作斗争。具体来说,如果安装了 bioconductor KEGGgraph
-package ,我想使用它的一些功能。本身取决于-package。从我读到的(虽然不清楚)是按照建议包括(和?)。KEGGgraph
graph
KEGGgraph
graph
从文档中,我看到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
似乎没有帮助。