[英]if-else vs ifelse with lists
为什么 if-else 构造和函数 ifelse() 的行为不同?
mylist <- list(list(a=1, b=2), list(x=10, y=20))
l1 <- ifelse(sum(sapply(mylist, class) != "list")==0, mylist, list(mylist))
l2 <-
if(sum(sapply(mylist, class) != "list") == 0){ # T: all list elements are lists
mylist
} else {
list(mylist)
}
all.equal(l1,l2)
# [1] "Length mismatch: comparison on first 1 components"
从 ifelse 文档:
‘ifelse’ returns a value with the same shape as ‘test’ which is
filled with elements selected from either ‘yes’ or ‘no’ depending
on whether the element of ‘test’ is ‘TRUE’ or ‘FALSE’.
所以你的输入长度为 1,所以输出被截断为长度 1。
您还可以通过一个更简单的示例来说明这一点:
ifelse(TRUE, c(1, 3), 7)
# [1] 1
if ( cond) { yes } else { no }
是一个控制结构。 它旨在影响编程分支而不是处理序列。 我认为很多人来自 SPSS 或 SAS,他们的作者选择“IF”来在他们的 DATA 或 TRANSFORM 函数中实现条件赋值,因此他们希望 R 的行为相同。 SA 和 SPSS 在那里的数据步骤中都有隐含的 FOR 循环。 而 R 来自编程传统。 R 的隐式 for 循环内置于许多矢量化函数(包括ifelse
)中。 lapply/sapply 函数是实现大多数顺序处理的更精明的方法,尽管它们在执行滞后变量访问方面没有成功,特别是如果有任何“效果”得到累积处理的随机特征。
ifelse
将构建逻辑值向量的表达式作为其第一个参数。 第二个和第三个参数需要是等长的向量,并且选择第一个或第二个。 这类似于具有隐式逐行操作模式的 SPSS/SAS IF
命令。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.