R: + = (artı eşittir) ve ++ (artı artı) eşdeğeri c ++ / c # / java, vb.?


Yanıtlar:



64

@ GregaKešpret'i takip ederek bir infix operatörü oluşturabilirsiniz:

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

7
(+1), ancak bir uyarı. Yazma x = %+=% y/2iadeleri x = (x + y)/2. Parantez eklemek, yani x = %+=% (y/2)sorunu çözer.
— knrumsey

@knrumsey Neden bu? Bölmenin daha yüksek öncelikli bir operatör olacağını tahmin ederdim.
— David Kelley

@DavidKelley Emin değilim. Ben seninleyim orada Bu sorunla bir kez bir proje üzerinde çalışırken karşılaştım ve sorunu bulmam bir saatimi aldı.
— knrumsey

Bir ekleme yapmadığınız bir işlevi çalıştırdığınızı unutmayın. İşlevler en yüksek önceliğe sahiptir, bu nedenle parantez olmadan y'yi işlev girdisi olarak ayrıştırır ve bölüm zincirden sonraki adımdır. Parantez, (y / 2) işlemini zincirin en üstüne yükseltir.
— Justin

34

R'nin bir kavramı yoktur increment operator(örneğin C'deki ++). Ancak, birini kendiniz uygulamak zor değildir, örneğin:

inc <- function(x)
{
 eval.parent(substitute(x <- x + 1))
}

Bu durumda arayacaksın

x <- 10
inc(x)

Ancak, işlev çağrısı ek yükünü sunar, bu nedenle kendiniz yazmaktan daha yavaştırx <- x + 1 . Eğer yanılmıyorsam increment operator, derleyicinin işini kolaylaştırmak için tanıtıldı, çünkü kodu doğrudan bu makine dili talimatlarına dönüştürebilirdi.


3
Bu işlev değeri döndüremez ve ardından artımlı ++ gibi arttıramaz. Daha çok + = veya ön artırma ++ 'ya benzer.
— Megatron

1
Yanlış! Derleyicinin işini kolaylaştırmak için artırma uygulanmadı. INCtalimat, öncelikle sayaçları uygulamak için işlemcilerde tanıtıldı (cf. Intel Yazılım Geliştirici Kılavuzu). Cevabı güncelleyeceğim.
— banan3'14

19

R'nin bu işlemleri yoktur çünkü R'deki (çoğu) nesne değişmezdir. Değişmezler. Tipik olarak, bir nesneyi değiştiriyormuşsunuz gibi göründüğünde, aslında bir kopyayı değiştiriyorsunuzdur.


19
Değişmezlik, nesneler için harika / arzu edilen bir özellik olsa da (okuyun: daha az hata) Değişmezliğin + = sorusuyla ilgili olduğunu düşünmüyorum. Diğer dillerde + = değişmez türlere uygulanabilir (.net'teki dizeler gibi). İşlem basitçe yeni bir nesne oluşturur ve verilen değişkeni bu yeni nesneye atar. Değişmezlik korunur ve değişken güncellenir.
— SFun28

4
İyi bir nokta. Bununla birlikte, değişmezlik kesinlikle bu tür bir işlemi daha az doğal hale getirir.
— hadley

15

10 artırın ve azaltın.

require(Hmisc)
inc(x) <- 10 

dec(x) <- 10

7
Bu işlevler Hmisc4.1.0 sürümünden itibaren kaldırılmış görünmektedir .
— llasram

2
@llasram bu gösterime bakarak kimseyi suçlayamam.
— BERS


4

Geçersiz kılabiliriz +. Tekli +kullanılırsa ve argümanının kendisi tekli bir +çağrı ise, o zaman çağıran ortamda ilgili değişkeni artırın.

`+` <- 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

diğer işlemler değişmez:

x + 2
# [1] 13
x ++ 2
# [1] 13
+x
# [1] 11
x
# [1] 11

Her şeyi yavaşlatacağın için yapma. Veya başka bir ortamda yapın ve bu talimatlarda büyük döngüler olmadığından emin olun.

Ayrıca şunu da yapabilirsiniz:

`++` <- function(x) eval.parent(substitute(x <-x +1))
a <- 1
`++`(a)
a
# [1] 2

0

Ayrıca kullanabiliriz inplace

library(inplace)
x <- 1
x %+<-% 2

-2

Bunu yapmanın başka bir yolu var ki çok kolay buluyorum, belki biraz yardımım olabilir

<<-Bu durumlar için kullanıyorum Operatörler <<-değeri ana ortama atar

inc <- function(x)
{
   x <<- x + 1
}

ve ona şöyle diyebilirsin

x <- 0
inc(x)

Değişken x olarak adlandırılmazsa bu işe yaramaz, yukarıda fikrinizin doğru bir uygulamasını bulabilirsiniz. Üstelik bunu söylemek yanlış <<- assigns the value to parent environment. Saygıyla olumsuz oy verin, kaldırmayı düşünün.
— Moody_Mudskipper
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.