Rには、c ++/c#/ othersのように+=
(プラスに等しい)または++
(プラスにプラス)の概念がありますか?
いいえ、ありません。以下を参照してください。 R言語定義:演算子
@GregaKešpretに従って、中置演算子を作成できます。
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
Rにはincrement operator
の概念がありません(たとえば、Cの++など)。ただし、たとえば次のように自分で実装することは難しくありません。
inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}
その場合、あなたは電話します
x <- 10
inc(x)
ただし、関数呼び出しのオーバーヘッドが発生するため、自分でx <- x + 1
と入力するよりもslowerです。間違っていない場合、increment operator
は、コードをそれらの機械語命令に直接変換できるため、コンパイラーの仕事を簡単にするために導入されました。
Rの(ほとんどの)オブジェクトは不変であるため、Rにはこれらの操作はありません。彼らは変わりません。通常、オブジェクトを変更しているように見える場合、実際にはコピーを変更しています。
10ずつ増減します。
require(Hmisc)
inc(x) <- 10
dec(x) <- 10
このようなことを支援するために、私たちはパッケージ、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
+
をオーバーライドできます。単項+
が使用され、その引数自体が単項+
呼び出しである場合、呼び出し環境の関連変数をインクリメントします。
`+` <- 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