【问题标题】:return value of if statement in rr中if语句的返回值
【发布时间】: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 工作原理的大局的机会。

【问题讨论】:

    标签: r function variable-assignment expression-evaluation


    【解决方案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 中。同样,在您的情况下,字符串值被隐式“返回”。

        【讨论】:

          猜你喜欢
          • 2015-07-28
          • 1970-01-01
          • 2016-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-04
          • 2018-04-18
          相关资源
          最近更新 更多