dplyr :: if_else () неправильно запускает функцию в качестве результата, тогда как base ifelse () работает отлично. Почему? - PullRequest
3 голосов
/ 06 марта 2020

Я понимаю основное различие между 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 должна быть удовлетворена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...