从命名空间调用函数

31

我试图修改R语言包中几个命令的功能。查看这些命令的源代码很容易。然而,该函数调用了其他在包名称空间中的函数。这些函数不是导出对象。那么我该如何访问它们呢?

具体例子:

如何访问在copula::rmvdc中使用的asCall()函数?

require(copula)
copula::rmvdc
getAnywhere("asCall")

我想知道如何访问copula包中的as.Call()函数。

> copula::asCall
Error: 'asCall' is not an exported object from 'namespace:copula'
2个回答

69

试试这个:

copula:::asCall

这个问题之前在R-help上得到了回答。该函数未被导出到包命名空间中,因此您需要使用:::运算符。通常,当函数不打算供一般使用时(例如,在这种情况下不需要对其进行文档编写),它们不会被导出。


14
我简直不敢相信…我尝试使用copula:asCall然后copula::asCall,然后说“好吧,我也不知道了”。 - JD Long

15

在开发过程中,使用 ?assignInNamespace 很有用。

它允许你将一个非导出函数的新副本注入到软件包的命名空间中。

如果 R 的错误信息更加有帮助就更好了。而不是:

Error: 'matrixToPaths' is not an exported object from 'namespace:OpenMx'

为什么不添加:

You might try OpenMx:::matrixToPaths"

1
“为什么不添加…” 因为您无法访问包的私有对象。这就是它们被称为“私有”的原因。实际上,有人可能会问 ::: 运算符存在的意义何在。 - Hong Ooi
::: 允许您对使用内部对象的 pkg 函数进行修改,以适应您的需求。这不正是开源精神吗? - xm1
assignInNamespace有意义,因为世界并不完美。也许在内部函数中存在一个错误,而您不想下载整个源代码并重新编译软件包。您只想更改一个参数。像这样的铁律假设了大多数程序员所没有的完美水平。 - JMenezes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接