小编典典

R中是否存在三元运算符?

all

正如问题所问的那样,R 中是否有类似于 C的三元运算符的控制序列?如果是这样,你如何使用它?谢谢!


阅读 85

收藏
2022-07-02

共1个答案

小编典典

if函数 inR并返回最新评估一样,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 语言的一些内部知识。

2022-07-02