【问题标题】:if-else vs ifelse with listsif-else 与带有列表的 ifelse
【发布时间】:2020-12-23 04:52:47
【问题描述】:

为什么 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"

【问题讨论】:

    标签: r if-statement


    【解决方案1】:

    来自 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
    

    【讨论】:

    • @Dason ,在不相关的注释上,如果说我有这个 df.stats$Mean.Result2 &lt;- ifelse((df.stats$t.test.equal &lt;= 0.05 &amp; df.stats$f.test &gt; 0.05 &amp; df.stats$Mean.Diff &lt; 0), "Slower", 0) 是否有另一种使用 if - else 构造来编写它的方法? ifelse 的性能是否优于 else if 构造
    【解决方案2】:

    if ( cond) { yes } else { no } 是一个控制结构。它旨在影响编程分叉,而不是处理序列。我认为许多人来自 SPSS 或 SAS,他们的作者选择“IF”在他们的 DATA 或 TRANSFORM 函数中实现条件赋值,因此他们希望 R 表现相同。 SA 和 SPSS 在数据步骤中都有隐式 FOR 循环。而 R 来自编程传统。 R 的隐式 for 循环内置于许多矢量化函数(包括 ifelse)中。 lapply/sapply 函数是实现大多数顺序处理的更精明的方式,尽管它们无法成功地进行滞后变量访问,尤其是如果有任何“影响”得到累积处理的随机化特征。

    ifelse 将构建逻辑值向量的表达式作为其第一个参数。第二个和第三个参数需要是长度相等的向量,并且选择其中的第一个或第二个。这类似于具有隐式逐行操作模式的 SPSS/SAS IF 命令。

    【讨论】:

      【解决方案3】:

      由于某种原因,这被标记为重复 Why does ifelse() return single-value output?

      所以解决这个问题的方法是:

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

      【讨论】:

      • 在这 2 年多的时间里,欺骗状态已被删除。不清楚您为什么要在此处回答先前提出的问题,而这不是问题所在。
      猜你喜欢
      • 2014-09-02
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 2020-01-07
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多