为什么ifelse将data.frame转换为列表:ifelse(TRUE,data.frame(1),0))!= data.frame(1)?

时间:2011-06-10 18:46:03

标签: class function r if-statement

如果为TRUE,我想从函数返回data.frame,否则使用return(ifelse(condition, mydf, NA))返回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 个答案:

答案 0 :(得分:20)

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。类似的事情发生在&&&上。

另见: