【问题标题】:Modify function in global environment在全局环境中修改函数
【发布时间】:2018-02-16 10:22:04
【问题描述】:

不确定这是否可行,但值得一问。我需要能够修改加载到全局环境中的函数。例如,假设我有一个类似下面的函数,它返回向量的中位数

myVec<-c(1,2,3,4,5,5,5,6,7,8,9,10)

average<-function(x){
  median(x)
}

average(myVec)

现在我想更新函数以返回平均值,但不改变函数的整体结构,所以我想更新 average() 使其变为

average<-function(x){
  mean(x)
}

这可能吗?我猜想以某种形式将函数写入临时文件并调用readLines()writeLines(),但到目前为止我还没有取得任何成功。

【问题讨论】:

  • 如果你想覆盖整个函数体,有body(average) &lt;- quote(mean(x))。我猜,在更精细的层面重写现有函数可能会变得很混乱。
  • 如果你定义一个函数两次,较新的函数会覆盖较旧的函数,因此将使用较新的函数。
  • 自修改代码往往很难调试。通常,人们会定义原始函数以将可替换功能作为参数传递。该参数本身可能是一个函数。
  • 也许你可以举一个“结构”很重要的例子。它可能像average = function(x){1+1; median(x)} 一样简单/愚蠢如果您的功能足够简单,也许这会有所帮助:stackoverflow.com/q/2458013
  • 如果函数不仅仅是对 median 的调用,请确保只替换单个函数调用而不是整个函数调用。在这种情况下,body(average)[[2]][[1]] &lt;- quote(mean) 就是您想要做的所有事情。

标签: r function environment


【解决方案1】:

我相信你的意思是关闭:

myVec<-c(1,2,3,4,5,5,5,6,7,8,9,10)

# this will create your function
create.average <- function (fun) {
  my.average <- function (x) {
    fun(x)
  }
  return(my.average)
}
# define average as mean
average <- create.average(mean)
average(myVec)
mean(myVec) # only to verify result

# re-define average as median
average <- create.average(median)
average(myVec)
median(myVec) # only to verify result

【讨论】:

  • 对不起,不是我想要的。弗兰克有它body(average) &lt;- quote(mean(x))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 2016-04-22
相关资源
最近更新 更多