R:+ =(加上等于)和++(加上加号)相当于c ++ / c#/ java等?

时间:2011-04-21 02:25:34

标签: r operators variable-assignment increment

R是否有+=(加上等于)或++(加上加号)作为c ++ / c#/其他人的概念?

10 个答案:

答案 0 :(得分:92)

不,它没有,请参阅:R Language Definition: Operators

答案 1 :(得分:55)

关注@GregaKešpret,您可以创建一个中缀运算符:

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

答案 2 :(得分:30)

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

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

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

x <- 10
inc(x)

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

答案 3 :(得分:15)

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

答案 4 :(得分:14)

增加和减少10。

require(Hmisc)
inc(x) <- 10 

dec(x) <- 10

答案 5 :(得分:3)

我们发布了一个包装程序,即绳索器,以帮助解决此类问题。您可以在这里了解更多信息:https://happylittlescripts.blogspot.com/2018/09/make-your-r-code-nicer-with-roperators.html

import os
def get_list():
    return os.listdir('/etc/app_data/')

答案 6 :(得分:2)

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

`+` <- 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

答案 7 :(得分:0)

还有另一种方法,我发现这很容易,也许会失去一些帮助

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

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

您可以这样称呼

x <- 0
inc(x)

答案 8 :(得分:0)

我们也可以使用inplace

library(inplace)
x <- 1
x %+<-% 2

答案 9 :(得分:0)

如果想在数组中使用i++来增加索引,可以试试i <- i + 1,例如

k = 0
a = 1:4
for (i in 1:4) 
    cat(a[k <- k + 1], " ")
# 1 2 3 4

但是这里的<-不能替换为=,它不会更新索引,

k = 0
a = 1:4
for (i in 1:4) 
    cat(a[k = k + 1], " ")
# 1 1 1 1

因为 =<- 并不总是等价的,如?`<-`