←
PDF 303 / 520 Conditions
→
English · PDF 303
Original PDF page 303
中文 · PDF 303

} else { !is.na(nms) & nms != "" } }

这个函数利用了标准的返回值规则:函数会返回它计算的最后一个值。在这里,就是 if 语句两个分支中的其中一个。

条件

条件必须求值为 TRUE 或 FALSE。如果它是一个向量,你会收到一条警告消息;如果它是 NA,你会得到一个错误。在你自己的代码中要留意这些消息:

if (c(TRUE, FALSE)) {} #> Warning in if (c(TRUE, FALSE)) {: #> the condition has length > 1 and only the #> first element will be used #> NULL if (NA) {} #> Error in if (NA) {: missing value where TRUE/FALSE needed

你可以使用 || (或)和 &&(与)来组合多个逻辑表达式。这些运算符是“短路”的:一旦 || 看到第一个 TRUE,它就会返回 TRUE,而不再计算其他任何内容。一旦 && 看到第一个 FALSE,它就会返回 FALSE。你绝不应该在 if 语句中使用 | 或 &:它们是向量化运算,作用于多个值(这就是为什么你在 filter() 中使用它们)。如果你确实有一个逻辑向量,可以使用 any() 或 all() 将其折叠为单个值。

在测试相等性时要小心。== 是向量化的,这意味着很容易得到多个输出。要么先检查长度是否已经是 1,要么用 all() 或 any() 折叠,要么使用非向量化的 identical()。identical() 非常严格:它总是返回单个 TRUE 或单个 FALSE,并且不会进行类型转换。这意味着在比较整数和双精度数时需要小心:

identical(0L, 0) #> [1] FALSE

你还需要警惕浮点数:

x <- sqrt(2) ^ 2 x #> [1] 2