Jawaban:
Tidak, tidak, lihat: R Definisi Bahasa: Operator
Mengikuti @ GregaKešpret Anda dapat membuat operator infiks:
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
x = %+=% y/2
kembali x = (x + y)/2
. Menambahkan tanda kurung, yaitu x = %+=% (y/2)
memecahkan masalah.
R tidak memiliki konsep increment operator
(seperti misalnya ++ dalam C). Namun, tidak sulit untuk menerapkannya sendiri, misalnya:
inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}
Dalam hal ini Anda akan menelepon
x <- 10
inc(x)
Namun, ini memperkenalkan fungsi panggilan overhead, jadi lebih lambat daripada mengetik x <- x + 1
sendiri. Jika saya tidak salah increment operator
diperkenalkan untuk membuat pekerjaan untuk kompiler lebih mudah, karena dapat mengubah kode ke instruksi bahasa mesin secara langsung.
INC
instruksi diperkenalkan pada prosesor terutama untuk mengimplementasikan penghitung (lih. Manual Pengembang Perangkat Lunak Intel). Saya akan memperbarui jawabannya.
R tidak memiliki operasi ini karena (sebagian besar) objek di R tidak dapat diubah. Mereka tidak berubah. Biasanya, saat Anda memodifikasi objek, Anda sebenarnya memodifikasi salinan.
Kami merilis paket, roperator, untuk membantu hal semacam ini. Anda dapat membaca lebih lanjut di sini: 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
Kita bisa mengesampingkan +
. Jika unary +
digunakan dan argumennya sendiri merupakan +
panggilan unary , maka tambahkan variabel yang relevan di lingkungan panggilan.
`+` <- 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
operasi lain tidak berubah:
x + 2
# [1] 13
x ++ 2
# [1] 13
+x
# [1] 11
x
# [1] 11
Jangan lakukan itu karena Anda akan memperlambat segalanya. Atau lakukan di lingkungan lain dan pastikan Anda tidak memiliki loop besar pada instruksi ini.
Anda juga bisa melakukan ini:
`++` <- function(x) eval.parent(substitute(x <-x +1))
a <- 1
`++`(a)
a
# [1] 2
Ada cara lain untuk melakukan ini, yang menurut saya sangat mudah, mungkin bisa membantu
Saya gunakan <<-
untuk situasi ini. Operator <<-
memberikan nilai ke lingkungan induk
inc <- function(x)
{
x <<- x + 1
}
dan Anda bisa menyebutnya seperti
x <- 0
inc(x)
x += 1
ataux++
-x = x + 1
bekerja.