繁体   English   中英

if-else 与带列表的 ifelse

[英]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命令。

出于某种原因,这被标记为为什么 ifelse() 返回单值输出的重复

因此,解决该问题的方法是:

a=3
yo <- ifelse(a==1, 1, list(c(1,2)))
yo[[1]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM