为什么这个R函数不能正确短路?

eanckbw9  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(107)

我正在学习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从左到右计算表达式;但这看起来像是从右向左求值。
有人能解释一下这是怎么回事吗?
(根据该网站的说法,这是正确的解决方案,代码没有任何问题。我想知道它为什么会这样工作。即使答案是我忽略了一些痛苦而明显的愚蠢之处。)

kmbjn2e3

kmbjn2e31#

||是“or”运算符,你不能用FALSE值来短路“or”运算符;你基本上忽略了那个参数,只看下一个参数,因为你在寻找任何TRUE值。
假设a是一个布尔值,它们应该等价(<==>)。

# or
FALSE || a <==> a
TRUE || a <==> TRUE
# and
TRUE && a <==> a
FALSE && a <==> FALSE
tyu7yeag

tyu7yeag2#

看起来这只是暂时的混乱。
|| 是OR,因此如果任一条件的计算结果为TRUE,则复合表达式的计算结果为TRUE。如果include_all为TRUE,则可以使表达式短路,但如果include_all为FALSE,则必须等待,以查看另一部分是什么。

相关问题