XCode 8 GM Seed - Ошибка при загрузке в TestFlight

Это происходит потому, что ifelse всегда будет возвращать значение. Когда вы запускаете ifelse(1<2,print("true"),print("false")), вы выбираете условие yes. Это условие является вызовом функции для печати "true" на консоли, и так оно и делается.

Но функция print() также возвращает свой аргумент, но невидимо (например, присвоения), иначе вы 'd имеет значение, напечатанное дважды в некоторых случаях. Когда выражение 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) о разности между ними.

10
задан vien vu 13 September 2016 в 03:44
поделиться