SORU
9 Ocak 2012, PAZARTESİ


Üçlü operatör R var mı?

Soru sorar gibi, R kontrol sırası ternary operator C benzer var mı? Eğer öyleyse, nasıl kullanıyorsun? Teşekkürler!

CEVAP
9 Ocak 2012, PAZARTESİ


if R işlev ve en son değerlendirme verir gibi, if-else ?: eşdeğerdir.

> a <- 1
> x <- if(a==1) 1 else 2
> x
[1] 1
> x <- if(a==2) 1 else 2
> x
[1] 2

R gücünü vektörleştirme. Üçlü operatör vektörleştirme ifelse

> a <- c(1, 2, 1)
> x <- ifelse(a==1, 1, 2)
> x
[1] 1 2 1
> x <- ifelse(a==2, 1, 2)
> x
[1] 2 1 2

Sadece şaka, c-tarzı ?: tanımlayabilirsiniz:

`?` <- function(x, y)
    eval(
      sapply(
        strsplit(
          deparse(substitute(y)), 
          ":"
      ), 
      function(e) parse(text = e)
    )[[2 - as.logical(x)]])

burada, parantez hakkında dikkat çekmek gerek kalmıyor

> 1 ? 2*3 : 4
[1] 6
> 0 ? 2*3 : 4
[1] 4
> TRUE ? x*2 : 0
[1] 2
> FALSE ? x*2 : 0
[1] 0

ama atama için parantez gerekir :(

> y <- 1 ? 2*3 : 4
[1] 6
> y
[1] 1
> y <- (1 ? 2*3 : 4)
> y
[1] 6

Son olarak, c ile çok benzer şekilde yapabilirsiniz:

`?` <- function(x, y) {
  xs <- as.list(substitute(x))
  if (xs[[1]] == as.name("<-")) x <- eval(xs[[3]])
  r <- eval(sapply(strsplit(deparse(substitute(y)), ":"), function(e) parse(text = e))[[2 - as.logical(x)]])
  if (xs[[1]] == as.name("<-")) {
    xs[[3]] <- r
        eval.parent(as.call(xs))
  } else {
    r
  }
}       

Parantez kurtulmak:

> y <- 1 ? 2*3 : 4
> y
[1] 6
> y <- 0 ? 2*3 : 4
> y
[1] 4
> 1 ? 2*3 : 4
[1] 6
> 0 ? 2*3 : 4
[1] 4

Bu günlük kullanım için değil, ama belki R dil bazı iç öğrenme için iyi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Amena

    Amena

    15 Kasım 2006
  • Friday NightFort

    Friday Night

    15 EYLÜL 2011
  • VJ VIMANA

    VJ VIMANA

    3 Mayıs 2007