我正在使用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
的来源,我发现没有提及requireNamespace
,library
或类似内容。但那么我的 requireNamespace
为什么不负责加载包呢?
答案 0 :(得分:1)
问题是神经网络只依赖 网格包,而它应该(或至少也是)导入它。 (See here讨论两者之间的差异。)
因此,当 neuralnet 中的函数调用grid.newpage()
时,如果 grid 被附加到网格,它将只能找到该函数搜索路径。但是对neuralnet::neuralnet()
的完全限定的调用不会附加 neuralnet ,这会触发 grid 的附件;并且在搜索路径上没有网格,它不知道grid.newpage
是什么。
要将网格导入 neuralnet ,请将此行添加到源包的NAMESPACE
文件
import(grid)
此行到DESCRIPTION
文件
Imports: grid
然后重新编译它。