Ответ 1
Это происходит потому, что ifelse
всегда будет возвращать значение. При запуске ifelse(1<2,print("true"),print("false"))
выбирается условие yes
. Это условие является вызовом функции для печати "true"
на консоли, и так оно и есть.
Но функция print()
также возвращает свой аргумент, но невидимо (например, присвоения), иначе вы бы дважды напечатали значение, напечатанное дважды. Когда выражение yes
оценивается, его результатом является то, что возвращает ifelse
, а ifelse
не возвращается невидимо, поэтому он печатает результат, так как это выполнялось в глобальной среде и без какого-либо присвоения.
Мы можем проверить некоторые варианты и проверить, что происходит.
> result <- print("true")
[1] "true" # Prints because the print() function was called.
> result
[1] "true" # The print function return its argument, which was assigned to the variable.
> ifelse(1<2, {print("true");"TRUE"},print("false"))
[1] "true" #This was printed because print() was called
[1] "TRUE" #This was printed because it was the value returned from the yes argument
Если мы назначим это ifelse()
> result <- ifelse(1<2, {print("true");"TRUE"},print("false"))
[1] "true"
> result
[1] "TRUE"
Мы также можем посмотреть на случай, когда оцениваются оба условия условия:
> ifelse(c(1,3)<2, {print("true");"TRUE"},{print("false");"FALSE"})
[1] "true" # The yes argument prints this
[1] "false" # The no argument prints this
[1] "TRUE" "FALSE" # This is the returned output from ifelse()
Вы должны использовать ifelse
для создания нового объекта, а не для выполнения действий на основе условия. Для этого используйте if
else
. R Inferno имеет хороший раздел (3.2) о различии между ними.