我正在通过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从左到右评估表达式;但这看起来像是从右到左进行评估。
有人能解释一下这里发生了什么吗?
(根据网站,这是正确的解决方案,并且代码没有任何问题。我想知道它为什么会这样运作。即使答案是我的'm'忽略了一些非常明显和愚蠢的东西。)
答案 0 :(得分:3)
好||
是“或”运算符。您不要将“或”运算符与FALSE值短路;你基本上忽略了那个参数,只看下一个参数,因为你正在寻找任何TRUE值。
假设a
是一个布尔值。这些应该是等价的(<==>
)。
# or
FALSE || a <==> a
TRUE || a <==> TRUE
# and
TRUE && a <==> a
FALSE && a <==> FALSE
此外,由于include_all
是一个长度为一的向量,而您正在与log$success
进行比较,因此会为log$success
的每个值回收该单个值。 R不区分标量值和矢量。
答案 1 :(得分:1)
这似乎是暂时的混乱。
||是OR,因此如果任一条件的计算结果为TRUE,则复合表达式的计算结果为TRUE。如果include_all为TRUE,则可以使表达式短路,但当include_all为FALSE时,必须等待查看其他部分是什么。