1. ホーム
  2. r

[解決済み] 三項演算子はRに存在するか?

2022-02-07 14:43:37

質問

質問のように、RにもCのような制御シーケンスがあるのでしょうか? 三項演算子 ? もしそうなら、どのように使うのですか?ありがとうございます。

解決方法は?

として if の中にある関数です。 R と同じで、最新の評価値を返すので、if-else は次のようになります。 ?: .

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

Rの力はベクトル化です。三項演算子のベクトル化は 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


冗談で、c-styleを定義することができます。 ?: :

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

ここでは、ブラケットを気にする必要はありません。

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

しかし、代入のために括弧が必要です :(

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


最後に、cでも似たようなことができます。

`?` <- 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
  }
}       

ブラケットをなくすことができます。

> 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

これらは日常的に使用するものではありませんが、R言語の内部を学ぶには良いかもしれません。