为`x < y <- z`定义时`<<-`的歧义

Posted

技术标签:

【中文标题】为`x < y <- z`定义时`<<-`的歧义【英文标题】:ambiguity of `<<-` when defining it for `x < y <- z` 【发布时间】:2019-05-15 18:40:11 【问题描述】:

@g-grothendieck 对this question 的回答启发了我尝试一些赋值函数,例如==&lt;-&gt;&lt;-

请参阅以下内容:

`><-` <- function(e1,e2,value) replace(e1, e1 > e2, value)
x <- c(5,15)
x > 10 <- 42
x
# [1]  5 42

我也可以为&lt; 定义它:

`<<-` <- function(e1, e2, value) replace(e1, e1 < e2, value)
x <- c(5,15)
x < 10 <- 42
x
# [1] 42 15

但问题是现在 &lt;&lt;- 运算符被重新定义,这不再起作用了:

x <<- "hello"

替换错误(e1, which(e1

有趣的是x &lt; y &lt;- z 调用&lt;&lt;-,即使它没有被覆盖。

rm(`<<-`)
x < 10 <- 42

x 的参数数量不正确

是否有一种方法可以在保留 &lt;&lt;- 的原始行为的同时仍定义此自定义行为?

【问题讨论】:

"但问题是现在 【参考方案1】:

这似乎有效:

`<<-` <- function(e1, e2, value)
  if(missing(value)) 
    eval.parent(substitute(.Primitive("<<-")(e1, e2)))
  else 
    replace(e1, e1 < e2,value)


x <- c(5,15)
x < 10 <- 42
x
# [1] 42 15

x <<- "hello"
x
# [1] "hello"

【讨论】:

以上是关于为`x < y <- z`定义时`<<-`的歧义的主要内容,如果未能解决你的问题,请参考以下文章

监督学习的Logistic回归算法

文法和语言

对链式比较运算符 (x < y < z) 的语言支持

BZOJ

c++中为啥赋值运算符重载返回类型是引用

我在创建乘法表程序时遇到分段错误[关闭]