web-dev-qa-db-ja.com

R:c ++ / c#/ Javaなどからの+ =(プラスと等しい)および++(プラスとプラス)同等?

Rには、c ++/c#/ othersのように+=(プラスに等しい)または++(プラスにプラス)の概念がありますか?

133
SFun28

いいえ、ありません。以下を参照してください。 R言語定義:演算子

99
Patrick Cuff

@GregaKešpretに従って、中置演算子を作成できます。

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

Rにはincrement operatorの概念がありません(たとえば、Cの++など)。ただし、たとえば次のように自分で実装することは難しくありません。

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

その場合、あなたは電話します

x <- 10
inc(x)

ただし、関数呼び出しのオーバーヘッドが発生するため、自分でx <- x + 1と入力するよりもslowerです。間違っていない場合、increment operatorは、コードをそれらの機械語命令に直接変換できるため、コンパイラーの仕事を簡単にするために導入されました。

31
Grega Kešpret

Rの(ほとんどの)オブジェクトは不変であるため、Rにはこれらの操作はありません。彼らは変わりません。通常、オブジェクトを変更しているように見える場合、実際にはコピーを変更しています。

17
hadley

10ずつ増減します。

require(Hmisc)
inc(x) <- 10 

dec(x) <- 10
15
Wanderer

このようなことを支援するために、私たちはパッケージ、roporatorsをリリースしました。詳しくはこちらをご覧ください: 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
3
Benbob

+をオーバーライドできます。単項+が使用され、その引数自体が単項+呼び出しである場合、呼び出し環境の関連変数をインクリメントします。

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