R: + = (plus sama dengan) dan ++ (plus plus) setara dari c ++ / c # / java, dll?

147

Apakah R memiliki konsep +=(plus sama dengan) atau ++(plus plus) seperti yang dilakukan c ++ / c # / others?

SFun28
sumber
8
Tidak, untuk melakukan x += 1atau x++- x = x + 1bekerja.
Joshua Dawson

Jawaban:

64

Mengikuti @ GregaKešpret Anda dapat membuat operator infiks:

`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
baptiste
sumber
6
(+1), tetapi kata peringatan. Pengetikan x = %+=% y/2kembali x = (x + y)/2. Menambahkan tanda kurung, yaitu x = %+=% (y/2)memecahkan masalah.
Knrumsey
@ Knrumsey Kenapa begitu? Saya akan menduga divisi akan menjadi operator yang lebih diutamakan.
David Kelley
@ Davidvidelley Tidak yakin. Aku bersamamu di sana. Saya mengalami masalah ini mengerjakan proyek sekali dan butuh satu jam untuk menemukan masalah.
Knrumsey
Ingat Anda menjalankan fungsi, bukan melakukan penambahan. Fungsi memiliki prioritas tertinggi sehingga tanpa tanda kurung ia mem-parsing y sebagai fungsi input dengan pembagian menjadi langkah berikutnya ke bawah rantai. Tanda kurung meningkatkan operasi (y / 2) ke atas rantai.
Justin
33

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 + 1sendiri. Jika saya tidak salah increment operatordiperkenalkan untuk membuat pekerjaan untuk kompiler lebih mudah, karena dapat mengubah kode ke instruksi bahasa mesin secara langsung.

Grega Kešpret
sumber
3
Fungsi ini tidak dapat mengembalikan nilai dan kemudian bertambah seperti postincrement ++. Ini lebih mirip dengan + = atau preincrement ++.
Megatron
Salah! Penambahan tidak diperkenalkan untuk membuat pekerjaan kompiler lebih mudah. INCinstruksi diperkenalkan pada prosesor terutama untuk mengimplementasikan penghitung (lih. Manual Pengembang Perangkat Lunak Intel). Saya akan memperbarui jawabannya.
banan3'14
19

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.

Hadley
sumber
18
Sementara immutability adalah properti yang bagus / diinginkan untuk objek (baca: lebih sedikit bug) saya tidak berpikir imutabilitas berkaitan dengan pertanyaan + =. Dalam bahasa lain + = dapat diterapkan ke tipe yang tidak dapat diubah (seperti string dalam .net). Operasi hanya membuat objek baru dan menetapkan variabel yang diberikan ke objek baru itu. Kekekalan dipertahankan dan variabel diperbarui.
SFun28
4
Poin yang bagus. Namun, ketidakmampuan membuat operasi semacam ini menjadi kurang alami.
Hadley
15

Kenaikan dan penurunan sebesar 10.

require(Hmisc)
inc(x) <- 10 

dec(x) <- 10
Pengembara
sumber
7
Fungsi-fungsi ini tampaknya telah dihapus dari Hmiscversi 4.1.0.
llasram
@ llasram melihat notasi itu, saya tidak bisa menyalahkan siapa pun.
bers
3

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
Moody_Mudskipper
sumber
-1

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)
Thevandalyst
sumber