Funkcja ifelse() przyjmuje trzy argumenty. Pierwszym jest obiekt logiczny lub dowolny obiekt, który można przekształcić w logikę, taki jak obiekty modów atomowych lub obiekty z listy trybów, w których lista ma tylko jeden poziom głębi i każdy element przyjmuje tylko jedną wartość. Można również użyć funkcji zwracającej wartości, które można przekształcić w wartości logiczne. Drugi argument to wartości, które mają zostać zwrócone, gdy pierwszy argument jest prawdziwy. Trzeci argument to wartości, które mają zostać zwrócone, gdy pierwszy argument jest fałszywy. Każdy element pierwszego argumentu jest testowany osobno. Elementy postaci trybu i brakujące elementy zwracają NA. W przeciwnym razie zwracana wartość dla danego elementu to wartość na tej samej pozycji w drugim (lub trzecim) argumencie. Na przykład, jeśli pierwszym argumentem jest wektor (T, T, F, T), drugim argumentem jest wektor (1,2,1,2), a trzecim argumentem (4,5,6,4) , to ifelse () zwraca (1,2,6,2). To jest:
> ifelse (c (T, T, F, T), c (1: 2,1: 2), c (4: 6,4))
[1] 1 2 6 2
Jeśli to możliwe, wynik ma takie same wymiary jak pierwszy argument. W przeciwnym razie zwracany jest wektor listy trybów o długości równej długości pierwszego argumentu. Na przykład:
> a.mat = matrix(0:3,2,2)
> a.mat
[,1] [,2]
[1,] 0 2
[2,] 1 3
> a.list = list(a.mat,c(“a”,”b”,”c”))
> a.list
[[1]]
[,1] [,2]
[1,] 0 2
[2,] 1 3
[[2]]
[1] “a” “b” “c”
> ifelse(a.mat,1:4,30:33)
[,1] [,2]
[1,] 30 3
[2,] 2 4
> ifelse(a.mat,1:4,a.list)
[[1]]
[,1] [,2]
[1,] 0 2
[2,] 1 3
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] 4
Zauważ, że w drugim wywołaniu ifelse () pierwszy element a.mat daje FALSE, a pierwszy element a.list to macierz, więc lista jest generowana. Jeśli długość pierwszego argumentu jest mniejsza niż długość drugiego (lub trzeciego) argumentu, zostaną użyte tylko te elementy w drugim (lub trzecim) argumencie do długości pierwszego argumentu. Na przykład:
> ifelse (c (T, F), 1: 5, 10:15)
[1] 1 11
Pierwszy element 1: 5 to 1, a drugi element 10:15 to 11, więc zwracane jest (1,11). Jeśli długość pierwszego argumentu jest większa niż długość drugiego (lub trzeciego) argumentu, drugi (lub trzeci) argument jest cykliczny. Na przykład:
> ifelse (c (T, F, F, F, T), 1: 3, 10:12)
[1] 1 11 12 10 2
Drugi argument przechodzi do (1,2,3,1,2), a trzeci argument przechodzi do (10,11,12,10,11). Jeśli tryby elementów wynikowych nie są takie same, wynik będzie miał tryb elementu o najwyższej hierarchii, w którym hierarchia przechodzi od najniższej do najwyższej logicznej, całkowitej, podwójnej, zespolonej, znakowej i listowej. Obiekty trybu NULL i raw powodują błąd. Na przykład:
> ifelse (c (T, F, F, F, T), 1: 5 + 1i, 1: 5)
[1] 1 + 1i 2 + 0i 3 + 0i 4 + 0i 5 + 1i
> ifelse (c (T, F, F, F, T), as.raw (2: 6), as.raw (12:16))
Error in ifelse(c(T, F, F, F, T), as.raw(2:6), as.raw(12:16)) :
incompatible types (from raw to logical) in subassignment type fix
Funkcji można użyć jako wartości dowolnego z trzech argumentów. Jeśli funkcja jest oceniana, wynik funkcji jest zwracany jako pierwszy. Ostatni wynik jest wynikiem zamiany. Na przykład:
> f.fun = function(mu, se=1, alpha=.05){
q_value = qnorm(1-alpha/2, mu, se)
print(q_value)
}
> ifelse (f.fun(1:2, alpha=1.0), f.fun(1:2), f.fun(3))
[1] 1 2
[1] 2.959964 3.959964
[1] 2.959964 3.959964
> ifelse (f.fun(0:2, alpha=1.0), f.fun(1:2), f.fun(3))
[1] 0 1 2
[1] 2.959964 3.959964
[1] 4.959964
[1] 4.959964 3.959964 2.959964
Zauważ, że w pierwszym wywołaniu f.fun(), alpha jest ustawiana na 1.0, więc zwracana jest mediana. Ponadto w pierwszym wywołaniu oceniane są dwie pierwsze funkcje, podczas gdy w drugim wywołaniu oceniane są wszystkie trzy funkcje. Jeśli wynik jest przypisany do obiektu, to wyniki funkcji są wypisywane na konsoli, ale wynik ifelse() jest przekazywany do obiektu. Na przykład:
> a=ifelse (f.fun(1:2, alpha=1.0), f.fun(1:2), f.fun(3))
[1] 1 2
[1] 2.959964 3.959964
> a
[1] 2.959964 3.959964
Funkcja ifelse () może być zagnieżdżona. Na przykład łańcuch Markowa pierwszego rzędu o długości sześć z dwoma stanami, w których znajduje się macierz przejścia
można wygenerować za pomocą zagnieżdżonych funkcji ifelse (). Oznacza to, że „A” będzie pierwszym stanem, a „B” drugim stanem:
> set.seed(6978)
> mc=”A”
> for (i in 2:6) {
+ rn = runif(1)
+ mc = c(mc, ifelse(mc[i-1]==”A”, ifelse(rn<=0.7,”A”,”B”),
ifelse(rn<=0.8,”B”,”A”)))
+ }
> mc
[1] “A” “A” “B” “B” “B” “B”
Więcej informacji o ifelse() można znaleźć, wpisując ?ifelse po znaku zachęty R.