“ if”语句中的短路逻辑评估

时间:2018-09-21 20:08:16

标签: 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)]) & is.na(refEndDate))
[1] TRUE

这将按预期返回TRUE。

(endDateList[length(endDateList)] != refEndDate)
[1] NA

这将按预期返回NA,因为两者都是NA。

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

如何获取上面的值以返回TRUE?

1 个答案:

答案 0 :(得分:1)

您只需要使用or或代替and。

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

您应该了解逻辑NA的含义。 NA表示该值未知,但仍需要为TRUEFALSE 。换句话说,如果不管NA值的状态如何,一条语句总是以一种方式求值,它将不会返回NA

例如,考虑以下情况:

> TRUE || NA
[1] TRUE

> FALSE || NA
[1] NA

> TRUE && NA
[1] NA

> FALSE && NA
[1] FALSE