如何在闭包中重新定义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
为什么你之前的写法无效?
- 你之前的生成函数只是在内部定义了新的
+,但没有返回这个函数,也没把它赋值到全局环境的+上,所以外部无法使用这个新定义的运算符。 - 新函数内部的
x + y会直接调用重定义后的+,没有引用原始加法,导致无限递归。
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

