} 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