gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:00:57 24 4
gpt4 key购买 nike

如果为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")

最佳答案

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在逻辑上下文中。类似的事情发生在 &&& .

也可以看看:
  • Patrick Burns 的第 3.2 节 R Inferno ...
  • Why can't R's ifelse statements return vectors?
  • 关于class - 为什么 ifelse 将 data.frame 转换为列表 : ifelse(TRUE, data.frame(1), 0)) != data.frame(1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6310733/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com