正如问题所问的那样,R 中是否有类似于 C的三元运算符的控制序列?如果是这样,你如何使用它?谢谢!
与if函数 inR并返回最新评估一样,if-else 等价于?:.
if
R
?:
> a <- 1 > x <- if(a==1) 1 else 2 > x [1] 1 > x <- if(a==2) 1 else 2 > x [1] 2
R 的强大之处在于矢量化。三元运算符的向量化为ifelse:
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 语言的一些内部知识。