运行 一行在 ifelse() 语句内部与外部时的不同输出

Different output when running a line inside vs. outside an ifelse() statement

我正在尝试 运行 一个简单的命令,但不知道为什么 运行 在 ifelse() 函数内部与外部输出不同。函数条件的计算结果为 FALSE,因此输出应该完全相同。

然而,当 运行 单独使用它时,输出是 0 0 1 1 0 1 0 1 NA(如预期的那样)但是从 ifelse() 函数中,输出是 0(不是预期的).

library(dplyr)
library(zoo)

x <- c(0, 1, 1, 0, 0, 1, 0, 1, 0)
del <- 2

dplyr::lead(zoo::rollsum(x, del - 1, fill = NA, align = "left")) == 0
[1] FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE    NA

ifelse(del == 1, -1, dplyr::lead(zoo::rollsum(x, del - 1, fill = NA, align = "left")) == 0)
[1] FALSE

对于为什么会发生这种情况,我将不胜感激!以前从未见过这样的事情。 ifelse() 的结果具有不同的长度,具体取决于条件被评估为真还是假,但我不明白为什么这会导致更长输出的 t运行 阳离子。

代码应该使用 if,而不是 ifelse。从 ?ifelse 开始,它表示以下内容,其中 testifelse 的第一个参数。

‘ifelse’ returns a value with the same shape as ‘test’

在问题 test 中,del == 1 是一个逻辑标量,因此结果也是 1。

此外,rollapply 可以使用 list(1:(del-1)) 来指代偏移量 1、2、...、del-1,其中正偏移量在前面。这看起来更干净,因为它直接实现了想要的东西而不是稍后修复它,而且它使用的包也更少。

library(zoo)

del <- 2
if (del == 1) -1 else rollapply(x == 0, list(1:(del-1)), all, fill = NA)
## [1] FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE    NA