问题描述
我试图运行一个简单的命令,但不知道为什么在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
开始,其内容如下:test
是ifelse
的第一个参数。
“ ifelse”返回的值与“ test”的形状相同
问题test
是del == 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