回答:
いいえ、そうではありません。R言語定義:演算子を参照してください。
@GregaKešpretに続いて、中置演算子を作成できます。
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
x = %+=% y/2
戻りますx = (x + y)/2
。括弧を追加する、つまりx = %+=% (y/2)
問題を解決します。
Rにはincrement operator
(Cの++などの)概念はありません。ただし、自分で実装することは難しくありません。たとえば、次のようにします。
inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}
その場合は、
x <- 10
inc(x)
ただし、関数呼び出しのオーバーヘッドが発生するため、自分で入力するよりも時間がかかりx <- x + 1
ます。私が間違っていない場合はincrement operator
、コードをそれらの機械語命令に直接変換できるため、コンパイラーの作業を容易にするために導入されました。
INC
命令は、主にカウンターを実装するためにプロセッサーに導入されました(インテルソフトウェア開発者マニュアルを参照)。回答を更新します。
Rの(ほとんどの)オブジェクトは不変であるため、Rにはこれらの操作はありません。彼らは変わりません。通常、オブジェクトを変更しているように見える場合、実際にはコピーを変更しています。
10ずつ増減します。
require(Hmisc)
inc(x) <- 10
dec(x) <- 10
Hmisc
は、バージョン4.1.0 から削除されたようです。
このようなことを支援するためのパッケージ、roperatorsをリリースしました。詳しくは、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
オーバーライドできます+
。単項+
が使用され、その引数自体が単項+
呼び出しである場合、呼び出し環境で関連する変数をインクリメントします。
`+` <- 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
これを行う別の方法があります。これは非常に簡単だと思います。おそらく助けにならないかもしれません
<<-
これらの状況で使用しますオペレーター<<-
は親環境に値を割り当てます
inc <- function(x)
{
x <<- x + 1
}
あなたはそれを次のように呼ぶことができます
x <- 0
inc(x)
x += 1
またはx++
-x = x + 1
動作します。