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


Jawaban:



64

Mengikuti @ GregaKešpret Anda dapat membuat operator infiks:

`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x

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.


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.


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

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

-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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.