R:+ =(等于)和++(等于)来自c ++ / c#/ java等?


Answers:



64

在@GregaKešpret之后,您可以创建一个中缀运算符:

`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x

6
(+1),不过是警告。输入x = %+=% y/2回报x = (x + y)/2。添加括号,即x = %+=% (y/2)解决问题。
knrumsey

@knrumsey为什么?我猜想除法将是一个更高优先级的运算符。
David Kelley

@DavidKelley不确定。我和你在一起。我曾经在一个项目上遇到过这个问题,却花了一个小时才找到问题。
knrumsey19年

请记住,您正在运行一个函数,而不是进行加法运算。函数具有最高优先级,因此如果没有括号,它将把y解析为函数输入,而除法则是下一步。括号将(y / 2)操作提升到链的顶部。
贾斯汀

33

R没有increment operator(例如C语言中的++)概念。但是,自己实现并不难,例如:

inc <- function(x)
{
 eval.parent(substitute(x <- x + 1))
}

在这种情况下,您会打电话给

x <- 10
inc(x)

但是,它引入了函数调用开销,因此它比键入您自己的速度慢x <- x + 1。如果我没记错的话,increment operator是为了使编译器工作更容易而引入的,因为它可以将代码直接转换为那些机器语言指令。


3
此函数无法返回该值,然后不能像后递增++那样递增。它更类似于+ =或preincrement ++。
威震天

错误!并未引入增量来简化编译器的工作。INC指令是在处理器中引入的主要用于实现计数器(请参阅《英特尔软件开发人员手册》)。我将更新答案。
banan3'14

19

R没有这些操作,因为R中的(大多数)对象是不可变的。他们没有改变。通常,当您看起来在修改对象时,实际上是在修改副本。


18
尽管不变性是对象的一个​​伟大/理想的属性(阅读:更少的错误),但我不认为不变性与+ =问题无关。在其他语言中,+ =可以应用于不可变类型(例如.net中的字符串)。该操作仅创建一个新对象,然后将给定变量分配给该新对象。保持不变性,并更新变量。
SFun11年

4
好点子。但是,不变性无疑会使这种操作变得不自然。
hadley 2011年

15

递增和递减10。

require(Hmisc)
inc(x) <- 10 

dec(x) <- 10

7
这些功能似乎已从Hmisc4.1.0版本中删除。
llasram

@llasram看着那个符号,我不能怪任何人。
贝尔


3

我们可以覆盖+。如果使用一元+,并且其参数本身是一元+调用,则在调用环境中增加相关变量。

`+` <- function(e1,e2){
    # if unary `+`, keep original behavior
    if(missing(e2)) {
      s_e1 <- substitute(e1)
      # if e1 (the argument of unary +) is itself an unary `+` operation
      if(length(s_e1) == 2 && 
         identical(s_e1[[1]], quote(`+`)) && 
         length(s_e1[[2]]) == 1){
        # increment value in parent environment
        eval.parent(substitute(e1 <- e1 + 1,list(e1 = s_e1[[2]])))
      # else unary `+` should just return it's input
      } else e1
    # if binary `+`, keep original behavior
    } else .Primitive("+")(e1,e2)
}

x <- 10
++x
x
# [1] 11

其他操作不变:

x + 2
# [1] 13
x ++ 2
# [1] 13
+x
# [1] 11
x
# [1] 11

不过不要这样做,因为这会减慢一切。或者在其他环境中执行此操作,并确保您对这些说明没有太大的了解。

您也可以这样做:

`++` <- function(x) eval.parent(substitute(x <-x +1))
a <- 1
`++`(a)
a
# [1] 2

-1

还有另一种方法,我觉得这很容易,也许可能会失去一些帮助

<<-在这些情况下使用运算符<<-将值分配给父环境

inc <- function(x)
{
   x <<- x + 1
}

你可以这样称呼它

x <- 0
inc(x)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.