R: += (plus equals) and ++ (plus plus) equivalent from c++/c#/java, etc.?

前端 未结 9 665
攒了一身酷
攒了一身酷 2020-11-29 00:40

Does R have a concept of += (plus equals) or ++ (plus plus) as c++/c#/others do?

相关标签:
9条回答
  • 2020-11-29 01:31

    Following @GregaKešpret you can make an infix operator:

    `%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
    x = 1
    x %+=% 2 ; x
    
    0 讨论(0)
  • 2020-11-29 01:38

    We can override +. If unary + is used and its argument is itself an unary + call, then increment the relevant variable in the calling environment.

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

    other operations don't change :

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

    Don't do it though as you'll slow down everything. Or do it in another environment and make sure you don't have big loops on these instructions.

    You can also just do this :

    `++` <- function(x) eval.parent(substitute(x <-x +1))
    a <- 1
    `++`(a)
    a
    # [1] 2
    
    0 讨论(0)
  • 2020-11-29 01:39

    We released a package, roperators, to help with this kind of thing. You can read more about it here: https://happylittlescripts.blogspot.com/2018/09/make-your-r-code-nicer-with-roperators.html

    install.packages('roperators')
    require(roperators)
    
    x <- 1:3
    x %+=% 1; x
    x %-=% 3; x
    y <- c('a', 'b', 'c')
    y %+=% 'text'; y
    y %-=% 'text'; y
    
    # etc
    
    0 讨论(0)
提交回复
热议问题