我想在我的包中提供一个名为“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/