Como if
est une fonction dans R
et renvoie la dernière évaluation, if-else est équivalent à ?:
.
> a <- 1
> x <- if(a==1) 1 else 2
> x
[1] 1
> x <- if(a==2) 1 else 2
> x
[1] 2
La puissance de R est la vectorisation. La vectorisation de l'opérateur ternaire est 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
Je plaisante, vous pouvez définir le style c ?:
:
`?` <- function(x, y)
eval(
sapply(
strsplit(
deparse(substitute(y)),
":"
),
function(e) parse(text = e)
)[[2 - as.logical(x)]])
ici, vous n'avez pas besoin de faire attention aux parenthèses :
> 1 ? 2*3 : 4
[1] 6
> 0 ? 2*3 : 4
[1] 4
> TRUE ? x*2 : 0
[1] 2
> FALSE ? x*2 : 0
[1] 0
mais vous avez besoin de parenthèses pour l'affectation :(
> y <- 1 ? 2*3 : 4
[1] 6
> y
[1] 1
> y <- (1 ? 2*3 : 4)
> y
[1] 6
Enfin, vous pouvez faire de manière très similaire avec 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
}
}
Vous pouvez vous débarrasser des crochets :
> 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
Ils ne sont pas destinés à un usage quotidien, mais peuvent être utiles pour apprendre certains éléments internes du langage R.
2 votes
Vous voulez quelque chose de plus puissant que
ifelse
ou simplement une forme plus compacte ?0 votes
@CarlWitthoft En général, une forme plus compacte ; simplement un moyen d'économiser l'écriture.
if (x>1) y=2 else y=3
. Rédactiony=
a un certain attrait.