return r 中 if 语句的值

return value of if statement in r

所以,我正在复习如何在 R 中使用数据帧,我从 https://cloud.r-project.org/web/packages/data.table/vignettes/datatable-intro.html:

中看到了这段代码
input <- if (file.exists("flights14.csv")) {
   "flights14.csv"
} else {
  "https://raw.githubusercontent.com/Rdatatable/data.table/master/vignettes/flights14.csv"
}

显然,这会根据条件将 if 和 else 语句中的字符串(字符向量?)分配给 input。这是如何工作的?这似乎很神奇。我希望能在官方 R 文档的某处找到解释这一点的地方。

如果是其他语言,我会这样做:

if (file.exists("flights14.csv")) {
   input <- "flights14.csv"
} else {
  input <- "https://raw.githubusercontent.com/Rdatatable/data.table/master/vignettes/flights14.csv"
}

或者在 R 中有 ifelse 似乎也设计用于执行此操作,但不知何故第一个示例也有效。我可以记住这是有效的,但我想知道我是否错过了了解 R 工作原理的大局的机会。

在 R 中,函数不需要显式 return。如果未指定,则自动返回函数的最后一行。考虑这个例子:

a <- 5
b <- 1

result <- if(a == 5) {
  a <- a + 1
  b <- b + 1
  a
} else {b}
result
#[1] 6

if 块中的最后一行保存在 result 中。同样,在您的情况下,字符串值是隐式“返回”的。

来自 ?Control 帮助页面“值”下的文档

if returns the value of the expression evaluated, or NULL invisibly if none was (which may happen if there is no else).

所以 if 语句有点像 return 是一个值的函数。 returned 的值是计算 ifthen 块的结果。当你在 R 中有一个块(代码在 {} 之间)时,括号也像一个函数,只是 return 在块中评估的最后一个表达式的值。字符串文字是 return 本身

的有效表达式

所以这些是一样的

x <- "hello"
x <- {"hello"}
x <- {"dropped"; "hello"}
x <- if(TRUE) {"hello"}
x <- if(TRUE) {"dropped"; "hello"}
x <- if(TRUE) {"hello"} else {"dropped"}

当 运行 有多个表达式或跨越多行时,您真正需要的块 {} 和 if/else 语句。所以你也可以做

x <- if(TRUE) "hello" else "dropped"
x <- if(FALSE) "dropped" else "hello"

这些都在x

中存储“hello”

您并没有真正遗漏任何有关 R 中“大局”的内容。与其他语言以及 R 的典型行为相比,R if 函数是非典型的。与 R 中的大多数需要将其输出分配给“符号”(即正确的 R 名称)的函数不同,if 允许在其后续代码块或替代代码块中发生的分配发生在全局环境中。大多数函数 return 只会进行最终评估,而函数体内发生的任何其他内容都会被垃圾收集。

另一个常见的非典型函数是for。 R for-只循环 保留这些内部分配并始终 return NULL。 R 语言定义将这些非典型 R 函数称为“控制结构”。见第 3.3 节。在我的机器上(我怀疑大多数 Linux 机器)该文档安装在:http://127.0.0.1:10731/help/doc/manual/R-lang.html#Control-structures。如果您在另一个 OS 上,那么您的 IDE 中可能有一个下拉帮助菜单,其中有一个指向它的指针。帮助文档称它们为“控制流构造”,帮助页面位于 ?Control。请注意,当您希望使用这些名称之一访问该帮助页面时,必须引用这些术语,因为它们是“保留字”。所以你需要 ?'if' 而不是输入 ?if。其他保留字在 ?Reserved 页面中描述。

?Control
?'if'  ; ?'for'
?Reserved

# When you just type:
?if  # and hit <return>
# you will see a "+"-sign which indicateds an incomplete expression.
# you nthen need to hit <escape> to get back to a regular R interaction.