gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:34:27 24 4
gpt4 key购买 nike

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

f已导出,我可以使用 this post 中描述的技术R-帮助:

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 , 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

关于r - 如何修改包中未导出的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38388570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com