如何修改包中的未导出对象

Hon*_*Ooi 5 r r-package

我的包(让我们称之为A)依赖于另一个包B.我需要修改fB中的一个函数,该函数有一个导致我的包失败的错误.问题是这f是一个未被发布的功能.

如果f导出,我可以使用这篇文章中描述的技术来帮助:

我想要修补这样的函数几次,我使用:

unlockBinding(name, env);
assignInNamespace(name, value, ns=pkgName, envir=env);
assign(name, value, envir=env);
lockBinding(name, env);
Run Code Online (Sandbox Code Playgroud)

但由于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"
Run Code Online (Sandbox Code Playgroud)

可以修改f吗?

Hon*_*Ooi 5

事实证明,我只需要删除unlockBinding,assignlockBinding调用即可。

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
Run Code Online (Sandbox Code Playgroud)