Ответ 1
ifelse
обычно предназначен для векторизованных сравнений и имеет побочные эффекты, такие как: как он говорит в ?ifelse
,
‘ifelse’ returns a value with the same shape as ‘test’ ...
поэтому в этом случае (test
- вектор длины 1) он пытается преобразовать фрейм данных в "вектор" (список в этом случае) длины 1...
return(if (condition) mydf else NA)
В качестве общей точки проектирования я пытаюсь вернуть объекты той же структуры независимо от того, что бы я мог предпочесть
if (!condition) mydf[] <- NA
return(mydf)
Как правило, я считаю, что пользователи R (особенно из других языков программирования) начинают с использования if
исключительно, найдите время, чтобы обнаружить ifelse
, а затем чрезмерно использовать его, обнаружив позже, что вы действительно хотите использовать if
в логических контекстах. Аналогичное происходит с &
и &&
.
См. также:
- раздел 3.2 Патрика Бернса R Inferno...
- Почему операторы if ifelse не возвращают векторы?