You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在闭包中重新定义R语言的'+'运算符?

解决R语言中重定义+运算符的无限递归问题

你遇到的核心问题是:重定义的+函数里调用x + y时,会递归调用自己,而不是使用原始的加法运算符。用闭包解决的关键是提前捕获并保存原始的+,让新函数能调用原始加法逻辑。

实现方式一:直接捕获原始运算符

先把全局环境里的原始+存到一个变量中,再定义新的+函数时,用这个变量执行原始加法,再加上2:

# 保存原始的`+`运算符
original_plus <- `+`

# 重定义`+`
`+` <- function(x, y) {
  original_plus(x, y) + 2
}

# 测试
2 + 2  # 输出6

实现方式二:用生成函数返回闭包

如果想用生成函数的方式,需要在生成函数内部先捕获原始+,再返回一个闭包(这个闭包会保留对原始+的引用),最后把这个闭包赋值给全局的+:

SillyPlusGenerator <- function() {
  # 在函数内部捕获原始的`+`
  original_plus <- `+`
  # 返回闭包,闭包会记住original_plus
  function(x, y) {
    original_plus(x, y) + 2
  }
}

# 将生成的闭包赋值给全局的`+`
`+` <- SillyPlusGenerator()

# 测试
2 + 2  # 输出6

为什么你之前的写法无效?

  1. 你之前的生成函数只是在内部定义了新的+,但没有返回这个函数,也没把它赋值到全局环境的+上,所以外部无法使用这个新定义的运算符。
  2. 新函数内部的x + y会直接调用重定义后的+,没有引用原始加法,导致无限递归。

内容的提问来源于stack exchange,提问作者J. Mini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 09:32:36