Время от времени я обнаружил, что ifelse-операторы R. Например:
ifelse(TRUE,1,2)
# [1] 1
ifelse(FALSE,1,2)
# [1] 2
Но меня несколько смущает следующее поведение.
ifelse(TRUE,c(1,2),c(3,4))
# [1] 1
ifelse(FALSE,c(1,2),c(3,4))
# [1] 3
Это вариант дизайна, который выше моей зарплаты?
r
if-statement
r-faq
Кристофер Дюбуа
источник
источник
Ответы:
В документации
ifelse
говорится:Поскольку вы передаете тестовые значения длины 1, вы получаете результаты длины 1. Если вы передаете более длинные тестовые векторы, вы получите более длинные результаты:
So
ifelse
предназначен для конкретной цели тестирования вектора логических значений и возврата вектора той же длины, заполненного элементами, взятыми из (вектора)yes
иno
аргументов.Это обычная путаница из-за имени функции, когда
if () {} else {}
вместо этого вам нужна обычная конструкция.источник
if (TRUE) c(1,2) else c(3,4)
.Держу пари, вам нужен простой
if
оператор вместоifelse
- в Rif
это не просто структура потока управления, она может возвращать значение:источник
" Warning in if (req(inputval) == "All") { : the condition has length > 1 and only the first element will be used"
что мне делать, чтобы избавиться от этого предупреждения?req(inputval)
нем больше элементов. Чтобы получить одно значение, функцииany()
илиall()
могут быть полезны.Обратите внимание, что вы можете обойти проблему, если назначите результат внутри
ifelse
:источник
ifelse()
функции вместо потока управленияif ... else ...
для назначения. Если условие - одноTRUE
илиFALSE
значение, я бы предпочел написатьa <- if (TRUE) c(1,2) else c(3,4)
илиif (TRUE) a <- c(1,2) else a <- c(3,4)
ifelse
вместоif
...else
в случае одного условия действительно может быть проблемой иifelse
может быть предпочтительнее в некоторых случаях внутри кода (простое предположение здесь), я не могу с вами не согласиться ;-). Я просто хотел показать свой путьifelse
.да, я думаю, что ifelse () действительно разработан для случаев, когда у вас есть большой длинный вектор тестов и вы хотите сопоставить каждый с одним из двух вариантов. Например, я часто использую цвета для plot () следующим образом:
Если у вас большой длинный вектор тестов , но хотел пар для выходов, вы можете использовать
sapply()
илиplyr
«Sllply()
или что - то, возможно.источник
Иногда пользователю просто нужен
switch
оператор вместоifelse
. В таком случае:(это еще один вариант синтаксиса ответа Кена Уильямса)
источник
Вот подход, аналогичный предложенному Катом, но он может работать с существующими заранее заданными векторами.
Он основан на использовании следующего
get()
:источник
используйте `if`, например
источник
В вашем случае было бы полезно использовать
if_else
fromdplyr
:if_else
более строгий, чемifelse
, и выдает ошибку для вашего случая:источник
Найдено на каждом дропре :
Может воспроизвести результат вашего состояния, чтобы вернуть желаемую длину
источник