r中if语句的返回值
Posted
技术标签:
【中文标题】r中if语句的返回值【英文标题】:return value of if statement in r 【发布时间】:2020-12-15 20:25:23 【问题描述】:所以,我正在复习如何在 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 工作原理的大局的机会。
【问题讨论】:
【参考方案1】:您并没有真正错过 R 中的“大局”。与其他语言以及 R 的典型行为相比,R if
函数是非典型的。与 R 中的大多数函数需要将其输出分配给“符号”(即正确的 R 名称)不同,if
允许在其后续或替代代码块中发生的分配发生在全局环境中。大多数函数只会返回最终的评估结果,而函数体内发生的任何其他事情都会被垃圾回收。
另一个常见的非典型函数是for
。 R for
-loops 仅
保留这些内部分配并始终返回 NULL。 R 语言定义将这些非典型 R 函数称为“控制结构”。请参阅第 3.3 节。在我的机器(我怀疑大多数 Linux 机器)上,该文档安装在:http://127.0.0.1:10731/help/doc/manual/R-lang.html#Control-structures。如果您在另一个操作系统上,那么您的 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.
【讨论】:
【参考方案2】:来自?Control
帮助页面“值”下的文档
if
返回评估的表达式的值,或者NULL
如果没有则不可见(如果没有 else 可能会发生)。
所以if
语句有点像一个返回值的函数。返回的值是评估 if
或 then
块的结果。当你在 R 中有一个块( 之间的代码)时,括号也像一个函数,它只返回在块中计算的最后一个表达式的值。字符串文字是返回自身的有效表达式
所以这些都是一样的
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
【讨论】:
【参考方案3】:在 R 中,函数不需要显式的 return
。如果未指定,则自动返回函数的最后一行。考虑这个例子:
a <- 5
b <- 1
result <- if(a == 5)
a <- a + 1
b <- b + 1
a
else b
result
#[1] 6
if
块中的最后一行保存在result
中。同样,在您的情况下,字符串值被隐式“返回”。
【讨论】:
以上是关于r中if语句的返回值的主要内容,如果未能解决你的问题,请参考以下文章