R:+ =(プラスは等しい)および++(プラスはプラス)c ++ / c#/ javaなどから同等ですか?


回答:



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 2018

@knrumseyどうして?除算の方が優先順位の高い演算子だと思いました。
デビッドケリー

@DavidKelleyわかりません。一緒にいます。この問題に出くわし、プロジェクトに一度取り組んだところ、問題を見つけるのに1時間かかりました。
knrumsey

追加ではなく、関数を実行していることを忘れないでください。関数の優先順位が最も高いので、括弧がない場合、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
この関数は値を返し、ポストインクリメント++のようにインクリメントすることはできません。+ =またはプリインクリメント++に似ています。
メガトロン

違う!インクリメントは、コンパイラーの作業を容易にするために導入されていません。INC命令は主にカウンターを実装するためにプロセッサーに導入されました(インテルソフトウェア開発者マニュアルを参照)。回答を更新します。
banan3'14

19

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


18
不変性はオブジェクトにとってすばらしい/望ましいプロパティですが(読み取り:バグが少ない)、不変性は+ =の質問に関係するとは思いません。他の言語では+ =は不変型(.netの文字列など)に適用できます。この操作では、単に新しいオブジェクトを作成し、指定された変数をその新しいオブジェクトに割り当てます。不変性が維持され、変数が更新されます。
SFun28

4
いい視点ね。ただし、不変性により、この種の操作は自然ではなくなります。
ハドリー2011

15

10ずつ増減します。

require(Hmisc)
inc(x) <- 10 

dec(x) <- 10

7
これらの関数Hmiscは、バージョン4.1.0 から削除されたようです。
llasram、2018年

@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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.