【问题标题】:How to modify unexported object in a package如何修改包中未导出的对象
【发布时间】:2016-07-15 05:41:07
【问题描述】:

我的包(我们称之为 A)依赖于另一个包 B。我需要修改 B 中的函数f,该函数有一个导致我的包失败的错误。问题是f 是一个未导出的函数。

如果f 被导出,我可以使用this post 中描述的技术来R-help:

有几次我想修补这样的功能,我使用:

unlockBinding(name, env);
assignInNamespace(name, value, ns=pkgName, envir=env);
assign(name, value, envir=env);
lockBinding(name, env);

但是因为f 未导出,所以这不起作用。

简单的例子来说明问题:

# rf is an exported function from the stats package; this works
foo <- function(x) x
unlockBinding("rf", as.environment("package:stats"))
assignInNamespace("rf", foo, ns="stats", pos="package:stats")
assign("rf", bar, pos="package:stats")
lockBinding("rf", as.environment("package:stats"))

rf(42)
# 42    


# C_rf is an unexported object that rf() uses; this fails
bar <- function(x) x + 1
unlockBinding("C_rf", as.environment("package:stats"))
assignInNamespace("C_rf", bar, ns="stats", pos="package:stats")
assign("C_rf", bar, pos="package:stats")
lockBinding("C_rf", as.environment("package:stats"))

# Error in unlockBinding("C_rf", as.environment("package:stats")) : 
#   no binding for "C_rf"

f可以修改吗?

【问题讨论】:

    标签: r r-package


    【解决方案1】:

    事实证明,我只需要删除 unlockBindingassignlockBinding 调用。

    bar <- function(x) x + 1
    assignInNamespace("C_rf", bar, ns="stats", pos="package:stats")
    
    stats:::C_rf
    # function(x) x + 1
    
    rf(3, 2, 2)
    #Error in .Call(C_rf, n, df1, df2) : 
    #  first argument must be a string (of length 1) or native symbol reference
    

    【讨论】:

    • 这可能会解决您的问题,但如果您打算发布,我怀疑您的包是否会被 CRAN 接受。
    猜你喜欢
    • 2021-04-12
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2012-04-04
    相关资源
    最近更新 更多