Я пытаюсь добавить некоторые необязательные удобные функции в пакет foo
, но я борюсь с зависимостями зависимостей. В частности, я хотел бы использовать некоторые функции пакета bioconductor KEGGgraph
, если он установлен. Сам KEGGgraph
зависит от graph
-пакета. Из того, что я прочитал (хотя это неясно), следует включить KEGGgraph
(и graph
?), как было предложено.
Из документации я вижу что requireNamespace
теперь поощряется вместе с использованием ::
вместо require
внутри функций. Действительно, проверка пакета также будет жаловаться, если используется require
. Однако, когда я использую requireNamespace
и ::
, зависимости KEGGgraph
не найдены.
Рассмотрим следующий минимальный воспроизводимый пример. С установленным KEGGgraph
и свежей R-сессией. Функция ниже не может найти функцию в пакете graph
:
# 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")
в условие if
в определении функции не помогает.
rc <- requireNamespace("KEGGgraph", quietly=TRUE, character.only=TRUE)
, а затем вы можете проверитьrc
. Я думаю, что недавно тоже попался на эту удочку --requireNamespace()
не является прямой заменойrequire()
. - person Dirk Eddelbuettel   schedule 25.05.2015