如果为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")
答案 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
。类似的事情发生在&
和&&
上。
另见: