Почему ifelse преобразует data.frame в список: ifelse (TRUE, data.frame (1), 0))! = Data.frame (1)? - PullRequest
15 голосов
/ 10 июня 2011

Я хочу вернуть data.frame из функции, если TRUE, иначе вернуть NA, используя return(ifelse(condition, mydf, NA))

Однако ifelse удаляет имена столбцов из data.frame.

Почемуотличаются ли эти результаты?

> data.frame(1)
  X1
1  1
> ifelse(TRUE, data.frame(1), NA)
[[1]]
[1] 1

Некоторые дополнительные сведения из dput ():

> dput(ifelse(TRUE, data.frame(1), 0))
list(1)
> dput(data.frame(1))
structure(list(X1 = 1), .Names = "X1", row.names = c(NA, -1L), 
          class = "data.frame")

1 Ответ

20 голосов
/ 10 июня 2011

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 в логических контекстах.Аналогичная вещь происходит с & и &&.

См. Также:

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