为什么该R功能不能正确短路?

为什么该R功能不能正确短路?,r,R,我正在数据营学习数据科学课程。不是插头。其中一个实践课程有以下完整的解决方案: # 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(i

我正在数据营学习数据科学课程。不是插头。其中一个实践课程有以下完整的解决方案:

# 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_infologs的工作原理与我预期的一样:它返回一个包含所有日志项的向量,而不管log$success的值是多少

第二个调用extract_infologs,include_all=FALSE不会返回我期望的结果。它返回一个向量,其中只包含log$success计算结果为FALSE的那些结果

在我看来,使用| |运算符应该会导致if块短路,第二次调用应该不会返回任何结果。据我所知,R从左到右计算表达式;但这看起来像是从右到左进行评估

有人能解释一下这是怎么回事吗

据该网站称,这是正确的解决方案,代码没有任何问题。我想知道为什么它是这样工作的。即使答案是我忽略了一些非常明显和愚蠢的事情。

嗯| |是or操作符。不要用假值使or运算符短路;您基本上忽略该参数,只需查看下一个参数,因为您正在查找任何真实值

假设a是一个布尔值。这些应该是等效的

另外,由于include_all是一个长度为1的向量,并且您要与log$success进行比较,所以对于log$success的每个值,都会回收该单个值。R不区分标量值和向量。

Well | |是or运算符。不要用假值使or运算符短路;您基本上忽略该参数,只需查看下一个参数,因为您正在查找任何真实值

假设a是一个布尔值。这些应该是等效的


另外,由于include_all是一个长度为1的向量,并且您要与log$success进行比较,所以对于log$success的每个值,都会回收该单个值。R不能区分标量值和向量。

这似乎是暂时的混淆


||是或,因此如果任一条件的计算结果为TRUE,则复合表达式的计算结果为TRUE。如果include_all为TRUE,则可以使表达式短路,但如果include_all为FALSE,则必须等待其他部分是什么

这似乎是暂时的困惑


||是或,因此如果任一条件的计算结果为TRUE,则复合表达式的计算结果为TRUE。如果include_all为TRUE,则可以使表达式短路,但如果include_all为FALSE,则必须等待其他部分是什么

| |是或。如果任一条件为TRUE,则其计算结果为TRUE,因此include_all为FALSE并不意味着它应该停止。你在考虑和吗?我精神崩溃了。这是我整个周末学习的收获。不是他们中有没有人是假的,保尔。如果其中任何一个是真的,执行。你能帮我回答一下吗?| |是或。如果任一条件为TRUE,则其计算结果为TRUE,因此include_all为FALSE并不意味着它应该停止。你在考虑和吗?我精神崩溃了。这是我整个周末学习的收获。不是他们中有没有人是假的,保尔。如果其中任何一个是真的,执行。你能帮我回答一下吗?
# or
FALSE || a <==> a
TRUE || a <==> TRUE
# and
TRUE && a <==> a
FALSE && a <==> FALSE