为什么这个R功能不能正常短路?

时间:2017-10-09 17:51:29

标签: r

我正在通过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'忽略了一些非常明显和愚蠢的东西。)

2 个答案:

答案 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时,必须等待查看其他部分是什么。