我正在学习DataCamp的数据科学课程。(不是插件。)其中一节练习课包含以下完整的解决方案:
# logs is available in your workspace
extract_info <- function(x, property = "success", include_all = TRUE) {
info <- c()
for (log in x) {
if (include_all || !log$success) {
info <- c(info, log[[property]])
}
}
return(info)
}
# Call extract_info() on logs, no additional arguments
extract_info(logs)
# Call extract_info() on logs, set include_all to FALSE
extract_info(logs, include_all = FALSE)
第一个调用(extract_info(logs)
)的工作方式与我预期的一样:它返回包含所有日志条目的向量(不管log$success
的值是什么)。
第二个调用(extract_info(logs, include_all = FALSE)
)没有返回我所期望的结果,它返回一个向量,其中只包含log$success
计算为FALSE
的那些结果。
在我看来,使用||
操作符应该会导致if块短路,第二个调用应该返回 nothing。据我所知,R从左到右计算表达式;但这看起来像是从右向左求值。
有人能解释一下这是怎么回事吗?
(根据该网站的说法,这是正确的解决方案,代码没有任何问题。我想知道它为什么会这样工作。即使答案是我忽略了一些痛苦而明显的愚蠢之处。)
2条答案
按热度按时间kmbjn2e31#
||
是“or”运算符,你不能用FALSE值来短路“or”运算符;你基本上忽略了那个参数,只看下一个参数,因为你在寻找任何TRUE值。假设
a
是一个布尔值,它们应该等价(<==>
)。tyu7yeag2#
看起来这只是暂时的混乱。
|| 是OR,因此如果任一条件的计算结果为TRUE,则复合表达式的计算结果为TRUE。如果include_all为TRUE,则可以使表达式短路,但如果include_all为FALSE,则必须等待,以查看另一部分是什么。