【问题标题】: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'

【问题讨论】:

    标签: r namespaces


    【解决方案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 函数进行修改,以满足您的需求。这不就是开源的精神吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2018-01-16
    • 2017-09-12
    相关资源
    最近更新 更多