R '中的短路逻辑评估;如果';陈述

R '中的短路逻辑评估;如果';陈述,r,R,我想在if语句中添加一个短路。其思想是,如果refEndDate和endDateList中的最后一项都为NA,则不执行第二个操作,但仍返回true。当前,&&的两侧都会运行,如果refEndDate或endDateList中的最后一个条目为NA,则可能会导致错误 endDateList <- c('2018-01-01', '2018-01-03', NA) refEndDate <- NA (is.na(endDateList[length(endDateList)]) &am

我想在if语句中添加一个短路。其思想是,如果refEndDate和endDateList中的最后一项都为NA,则不执行第二个操作,但仍返回true。当前,
&&
的两侧都会运行,如果refEndDate或endDateList中的最后一个条目为NA,则可能会导致错误

endDateList <- c('2018-01-01', '2018-01-03', NA)
refEndDate <- NA


(is.na(endDateList[length(endDateList)]) & is.na(refEndDate))
[1] TRUE
这会像预期的那样返回NA,因为两者都是NA

((is.na(endDateList[length(endDateList)]) & is.na(refEndDate)) &&
    (endDateList[length(endDateList)] != refEndDate))
[1] NA

如何使上述结果返回TRUE?

您只需要使用or而不是and

((is.na(endDateList[length(endDateList)]) & is.na(refEndDate)) || 
       (endDateList[length(endDateList)] != refEndDate))
[1] TRUE
您应该理解逻辑
NA
的含义
NA
表示该值未知,但仍需要
TRUE
FALSE
。换句话说,如果一条语句总是单向求值,而不管
NA
值的状态如何,它将不会返回
NA

例如,考虑以下情况:

> TRUE || NA
[1] TRUE

> FALSE || NA
[1] NA

> TRUE && NA
[1] NA

> FALSE && NA
[1] FALSE

第二句话是什么意思?如果1为真,则无论值为2,结果都应为
true
。如果1为false,那么结果应该为false(因为您在那里放置了
&
)。我说得对吗?
> TRUE || NA
[1] TRUE

> FALSE || NA
[1] NA

> TRUE && NA
[1] NA

> FALSE && NA
[1] FALSE