requireNamespace 未加载所需的功能

requireNamespace not loading required function

我正在使用 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"

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

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

问题是 neuralnetdependsgrid 包上,当它应该相反(或至少也是)导入它。 (See here 讨论两者之间的区别。)

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

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

import(grid)

并将此行添加到其 DESCRIPTION 文件

Imports: grid

然后重新编译。