如何修改包中未导出的对象
How to modify unexported object in a package
我的包(我们称它为 A)依赖于另一个包 B。我需要修改 B 中的一个函数 f
,它有一个导致我的包失败的错误。问题是 f
是一个未导出的函数。
如果 f
被导出,我可以使用 this post 中描述的技术来帮助 R-help:
The few times I want to patch a function like this, I use:
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
?
事实证明,我只需要删除 unlockBinding
、assign
和 lockBinding
调用即可。
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
我的包(我们称它为 A)依赖于另一个包 B。我需要修改 B 中的一个函数 f
,它有一个导致我的包失败的错误。问题是 f
是一个未导出的函数。
如果 f
被导出,我可以使用 this post 中描述的技术来帮助 R-help:
The few times I want to patch a function like this, I use:
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
?
事实证明,我只需要删除 unlockBinding
、assign
和 lockBinding
调用即可。
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