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 语句有点像一个返回值的函数。返回的值是评估 ifthen 块的结果。当你在 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语句的返回值的主要内容,如果未能解决你的问题,请参考以下文章

当方法包含多个具有多个返回的 if 语句时,如何从方法中获取返回值?

if函数如何实现返回值的循环

Java使用if else语句的方法返回值

Django模板if语句返回错误值

if 语句的值没有返回到父函数的上下文视图

mysql中 if语句的使用