从命名空间调用函数

Posted

技术标签:

【中文标题】从命名空间调用函数【英文标题】:Calling a function from a namespace 【发布时间】:2011-01-11 01:00:52 【问题描述】:

我正在尝试更改 R 包中一些命令的功能。很容易看到命令的来源。但是,该函数调用包命名空间中的其他函数。这些函数不是导出的对象。那么如何访问它们呢?

具体例子:

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

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

所以 as.Call() 存在于 copula 包中,但我如何访问它?

> copula::asCall
Error: 'asCall' is not an exported object from 'namespace:copula'

【问题讨论】:

【参考方案1】:

试试这个:

copula:::asCall

这是previously answered on R-help。该函数未在包命名空间中导出,因此您需要改用 ::: 运算符。当函数不用于一般用途时(例如,在这种情况下您不需要记录它们),通常不会导出函数。

【讨论】:

我不敢相信...我尝试了 copula:asCall 然后 copula::asCall 然后说“well hellifiknow”【参考方案2】:

开发时,?assignInNamespace非常有用。

这允许您将未导出函数的新副本注入包的命名空间。

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

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

为什么不添加:

You might try OpenMx:::matrixToPaths"

【讨论】:

"why not add ..." 因为你不应该访问包的私有对象。这就是为什么它们被称为“私人”。事实上,人们可能会问为什么::: 运算符甚至存在。 ::: 允许您对使用内部对象的 pkg 函数进行修改,以满足您的需求。这不就是开源的精神吗?

以上是关于从命名空间调用函数的主要内容,如果未能解决你的问题,请参考以下文章

Socket.IO 命名空间,调用未定义函数 .of()

实现函数调用的命名空间

C++ 从 std::async 函数读取命名空间中的全局变量标志

Boost python,使用命名空间调用函数对象

调用在另一个命名空间中定义的 PHP 函数,不带前缀

递归函数