【问题标题】:How to get apply functions to have side effects?如何让应用函数产生副作用?
【发布时间】:2016-02-05 23:02:24
【问题描述】:

我希望应用函数调用的函数在全局范围内具有副作用,即影响全局范围内的变量。如您所见,这不起作用:

library(zoo)
test=1
rollapply(1:10, width=2, function(x) test=test+1)
# [1] NA NA NA NA NA NA NA NA NA
test
# 1

我希望每次调用function(x) 时都会增加测试,不幸的是,在执行rollapply 之后测试仍然是1。有没有可能解决这个问题?

【问题讨论】:

  • 不是NULL + 1numeric(0)吗?
  • 您可以使用 '
  • assign 接受环境参数,<<- 搜索所有 parent.frames 直到它到达全局,如果它没有找到它将分配一个新值。
  • @bunk 可以在不使用 '
  • 通常,如果你不得不问如何做到这一点,你不知道有更好的方法来实现你的实际目标。这就是为什么这个问题的标准答案是你不应该这样做。

标签: r apply side-effects


【解决方案1】:

通常,R 不支持在函数范围之外更改变量。这样做的原因是减少代码的互连性。这是一件好事,因为它可以更容易地推理特定代码段正在做什么,而不必考虑它周围的所有上下文。尤其是在大型程序中,这可能会产生非常难以修复的错误。

但是,使用 <<- 运算符可以覆盖此行为:

a = 1
spam = function() {
    a <<- a + 1
}
spam()
a
[1] 2

但是,如果通常不需要并且不鼓励这样做。

通常,函数不会保持状态,即一旦函数完成,函数内部的所有信息都会被丢弃。查看closures 以获取保持状态的函数,这可能会解决您的问题(您没有说明)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2012-01-13
    • 2022-07-16
    • 2016-12-11
    • 2011-04-10
    • 2021-01-25
    相关资源
    最近更新 更多