requireNamespace不加载所需的函数

时间:2016-07-06 14:41:06

标签: r r-package

我正在使用R Packages来训练神经网络。该包,更具体地说是neuralnet的绘图功能,取决于grid,这是自去年以来的基础包。但是,除非我手动加载grid,否则绘图失败:

AND <- c(rep(0,7),1)
OR <- c(0,rep(1,7))
binary.data <- data.frame(expand.grid(c(0,1), c(0,1), c(0,1)), AND, OR)
net <- neuralnet::neuralnet(AND + OR ~ Var1 + Var2 + Var3, binary.data, 
                       hidden = 0, linear.output=FALSE)

if(requireNamespace("grid")) {
  neuralnet::plot.nn(net)
}

> Error in plot.nn(net, rep = i, x.entry, x.out, radius, arrow.length, intercept,  : 
> could not find function "grid.newpage"

使用library(grid)有帮助,但我想避免这种情况,因为我想稍后在我自己的包中使用它。 https://github.com/lodash/lodash/issues/1930建议使用requireNamespace,但这也无济于事,正如我们上面所见。

grid::函数的所有调用之前添加grid并从源代码构建包解决了这个问题,但我想知道:这是预期的行为吗?查看neuralnet的来源,我发现没有提及requireNamespacelibrary或类似内容。但那么我的 requireNamespace为什么不负责加载包呢?

1 个答案:

答案 0 :(得分:1)

问题是神经网络依赖 网格包,而它应该(或至少也是)导入它。 (See here讨论两者之间的差异。)

因此,当 neuralnet 中的函数调用grid.newpage()时,如果 grid 被附加到网格,它将只能找到该函数搜索路径。但是对neuralnet::neuralnet()的完全限定的调用不会附加 neuralnet ,这会触发 grid 的附件;并且在搜索路径上没有网格,它不知道grid.newpage是什么。

要将网格导入 neuralnet ,请将此行添加到源包的NAMESPACE文件

import(grid)

此行到DESCRIPTION文件

Imports: grid

然后重新编译它。