Поскольку вопрос задает, есть ли последовательность управления в R, подобная тернарному оператору C ? Если да, то как ты это используешь? Спасибо!
175
Поскольку вопрос задает, есть ли последовательность управления в R, подобная тернарному оператору C ? Если да, то как ты это используешь? Спасибо!
ifelse
, или просто более компактную форму?if (x>1) y=2 else y=3
. Письмоy=
однажды имеет определенную привлекательность для этого.Ответы:
Как
if
это функцияR
и возвращает последнее вычисление, если-иначе эквивалентно?:
.Степень R - векторизация. Векторизация троичного оператора
ifelse
:Шучу, вы можете определить с-стиль
?:
:здесь вам не нужно заботиться о скобках:
но вам нужны скобки для назначения :(
Наконец, вы можете сделать очень похожий путь с помощью c:
Вы можете избавиться от скобок:
Они не для ежедневного использования, но, возможно, хороши для изучения некоторых внутренних предметов языка R.
источник
Как и все остальные, используйте
ifelse
, но вы можете определить операторы так, чтобы у вас почти был синтаксис троичных операторов.Это на самом деле работает, если вы определяете операторы без
%
знаков, так что вы могли бы иметь(Это работает, потому что приоритет
:
ниже, чем?
.)К сожалению, это нарушает существующие операторы справки и последовательности.
источник
Так же, как шутка, вы можете переопределить
?
оператора, чтобы (почти) работать как троичный оператор (ЭТО ПЛОХАЯ ИДЕЯ):... Но вы должны поместить выражения в скобки, потому что приоритет по умолчанию не такой, как в C.
Просто не забудьте восстановить старую функцию помощи, когда закончите играть:
источник
Я бы посмотрел на
ifelse
команду. Я бы назвал это еще лучше, потому что это также векторизация. Пример использования набора данных автомобилей:источник
ifelse
своем примере? ;)Ваша ссылка указывает на
if
утверждение.Если ваша входная переменная является вектором, то
ifelse
может быть более подходящим:Чтобы получить доступ к странице справки для
if
, вам необходимо вставитьif
в обратные ссылки:Страница справки для
ifelse
:источник
print(if (x<2) "Less than" else "Greater than")
Это явно не существует, но вы можете сделать:
или
Различие между ними состоит в том, что
condition1
должно быть логическим вектор длины 1, в то время какcondition2
должно быть логическим вектор такой же длины , какx
,y
иz
. Первый вернет либоy
илиz
(весь объект), а второй вернет соответствующий элементy
(condition2==TRUE
) илиz
(condition2==FALSE
).Также обратите внимание , что
ifelse
будет происходить медленнее , чемif
/else
еслиcondition
,y
иz
все векторы с длиной 1.источник
if
работает как невекторизованный ifelse, если используется следующим образом:Преимущество использования этого по сравнению с ifelse заключается в том, что векторизация мешает (т. Е. У меня скалярные логические и списочные / векторные вещи в результате)
источник