Я понимаю основное различие между dplyr::if_else()
и базовым ifelse()
: строгая проверка типов между истинными и ложными результатами в первом.
Однако я заметил другое отличие, и мне интересно, это предполагаемое поведение, или если я просто делаю это неправильно.
Вот простой код:
library(dplyr)
choose_number <- function() {
n <- readline("Choose a number between 1 and 4: ")
n <- as.integer(n)
if (between(n, 1, 4)) { return(n) }
else { return(NA_integer_) }
}
# base ifelse() - works perfectly
get_answer <- function(pick = FALSE, n = 2) {
n <- ifelse(pick, choose_number(), as.integer(n))
return(n)
}
# dplyr::if_else() - does not work in the same way
get_answer <- function(pick = FALSE, n = 2) {
n <- if_else(pick, choose_number(), as.integer(n))
return(n)
}
Я хочу, чтобы get_answer()
вызывал choose_number()
только тогда, когда аргумент pick
правда. В противном случае он должен просто вернуть значение n
. Это прекрасно работает с базой ifelse()
в приведенном выше коде, но не с версией dplyr
.
Версия dplyr
не возвращает ошибку или предупреждение, однако ; он по-прежнему вызывает choose_number()
, но игнорирует результат и просто возвращает значение по умолчанию n
.
Опция true
для if_else
, choose_number()
, вернет целое число, как и false
вариант. Поэтому, на мой взгляд, функция проверки типа if_else
должна быть удовлетворена.