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

Dav*_*uer 17 if-statement r class function

如果为TRUE,我想从函数返回data.frame,否则返回NA return(ifelse(condition, mydf, NA))

但是,ifelse会从data.frame中删除列名.

为什么这些结果不同?

> data.frame(1)
  X1
1  1
> ifelse(TRUE, data.frame(1), NA)
[[1]]
[1] 1
Run Code Online (Sandbox Code Playgroud)

来自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")
Run Code Online (Sandbox Code Playgroud)

Ben*_*ker 23

ifelse通常用于矢量化比较,并具有如下的副作用:正如它所说的?ifelse,

‘ifelse’ returns a value with the same shape as ‘test’ ...
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下(test是长度为1的向量),它试图将数据帧转换为长度为1的"向量"(在本例中为列表)...

return(if (condition) mydf else NA)
Run Code Online (Sandbox Code Playgroud)

作为一般设计点,我尝试返回相同结构的对象,无论如何,所以我可能更喜欢

if (!condition) mydf[] <- NA
return(mydf)
Run Code Online (Sandbox Code Playgroud)

作为一般规则,我发现R用户(特别是来自其他编程语言)首先使用if,使用一段时间来发现ifelse,然后过度使用它一段时间,稍后发现你真的想if在逻辑上下文中使用它.类似的事情发生在&&&.

也可以看看: