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.