requireNamespace 未加载所需的函数

seb*_*nmm 5 r r-package

我用来neuralnet训练神经网络。该包,更具体地说是 的绘图功能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"
Run Code Online (Sandbox Code Playgroud)

使用library(grid)帮助,但我想避免这种情况,因为我想稍后在我自己的包中使用它。R 包建议使用requireNamespace,但这也没有帮助,正如我们在上面看到的。

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

Jos*_*ien 4

问题是神经网络依赖网格包,而它应该(或至少也)导入它。(有关两者之间差异的讨论请参见此处。)

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

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

import(grid)
Run Code Online (Sandbox Code Playgroud)

并将这一行添加到其DESCRIPTION文件中

Imports: grid
Run Code Online (Sandbox Code Playgroud)

然后重新编译它。