gpt4 book ai didi

r - 暂时覆盖函数

转载 作者:行者123 更新时间:2023-12-02 07:28:40 29 4
gpt4 key购买 nike

我想在我的包中提供一个名为“Sdt”的函数。它有多种方法,但它们都导致 Sdt.default(a, b, c, d),它返回一个命名向量,其中包含 a、b、c 和 d 的一些计算内容。

但在某些情况下,我的包的用户需要扩展 Sdt.default,例如,如果他/她想用这四个变量尝试一些其他计算。

于是我想:为什么不暂时覆盖函数呢?所以我尝试了这样的事情(当然是 Sdt,但这是一个更好的玩具示例):

a <- function() print("FUNCTION A CALLED")
b <- function() print("FUNCTION B CALLED")
c <- function() a()
d <- function(){

a()
a <- b
a()

c()
}
d()

结果是这样的

[1] "FUNCTION A CALLED"
[1] "FUNCTION B CALLED"
[1] "FUNCTION A CALLED"

但我想拥有

[1] "FUNCTION A CALLED"
[1] "FUNCTION B CALLED"
[1] "FUNCTION B CALLED"

“<<-”运算符在这个例子中可以工作,但是如果 a() 是在一个包中定义的,它会抛出错误消息,(“包中的确定函数不能被改变”或类似的东西)

长话短说如何从全局环境中临时但完整地覆盖包中的函数,以便所有后续调用和嵌套调用都使用更改后的函数?

最佳答案

我是@DavidArenburg 解决方案的粉丝,但如果为您想要临时覆盖的所有变量定义默认参数不是一个选项,这是另一种方式:

d <- function(){
a()
a <- b
a()
environment(c) <- environment()
c()
}
d()
# [1] "FUNCTION A CALLED"
# [1] "FUNCTION B CALLED"
# [1] "FUNCTION B CALLED"
c()
# [1] "FUNCTION A CALLED"

关于r - 暂时覆盖函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24698211/

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