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

问题描述

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

但是,单独运行时,输出0 0 1 1 0 1 0 1 NA(根据需要),但是从ifelse()函数中,输出0(不期望)。

library(dplyr)
library(zoo)

x <- c(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,align = "left")) == 0)
[1] FALSE

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

解决方法

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

“ ifelse”返回的值与“ test”的形状相同

问题testdel == 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