当前位置: 首页 > 知识库问答 >
问题:

隐式vs显式如果/在R中,括号改变输出?

杜俊晤
2023-03-14

当函数中隐式使用if/else语句而不是显式指定if/else语句中包含的表达式时,我很难理解一些R行为。

这个玩具函数的工作原理和我预期的一样,当收到TRUE时打印"x is TRUE",当收到FALSE时打印"x is FALSE"

f1 <- function(x){
  if (x)
    print("x is TRUE")
  else 
    print("x is FALSE")
}

> f1(TRUE)
[1] "x is TRUE"
> f1(FALSE)
[1] "x is FALSE"
>

然而,如果我向它添加一个隐式的嵌套if语句,那么它就会停止我所期望的行为。下面的函数应该与上面的函数完全相同,但是如果给它一个FALSE,它就不会打印任何内容。

f1 <- function(x){
  if (x)
    if(TRUE)
      print("x is TRUE")
  else 
    print("x is FALSE")
}

> f1(TRUE)
[1] "x is TRUE"
> f1(FALSE) # No output?
> 

最后,如果我添加括号来指定排列并使if/else显式,它将再次按预期运行:

f1 <- function(x){
  if (x){
    if (TRUE)
      print("x is TRUE")
  } else {
    print("x is FALSE")
  }
}

> f1(TRUE)
[1] "x is TRUE"
> f1(FALSE)
[1] "x is FALSE"
>

在网上搜索这个问题时,我发现了两个模糊相关的答案。一个讨论括号不起作用的问题,但如果括号完全缺失,则不讨论不同的输出,另一个讨论著名的问题“其他”错误中出现意外的“其他”。从他们那里,我了解到R可能将if语句解释为它自己的行,但我不明白为什么函数或任何其他输出中没有意外的else抛出错误。

有人能帮我理解R的控制流逻辑吗?

共有1个答案

严瑞
2023-03-14

与许多语言一样,R贪婪地将else附加到最近的if。因此,您的代码没有按R读取的方式缩进,这是

  if (x)
    if(TRUE)
      print("x is TRUE")
    else 
      print("x is FALSE")

if(TRUE)语句获取了ther,并且由于TRUETRUE,因此永远不会执行ther

R中的一个奇怪之处是,如果直接将它们输入到控制台,而不是函数中,它们的行为会有所不同。然后它贪婪地完成语句,所以我上面写的是语法错误:

  if (x)
    if(TRUE)
      print("x is TRUE")

是一个完整的语句,因此将执行它。然后,当您输入else时,您会得到一个错误,因为else不允许启动语句。

 类似资料:
  • 驱动程序级别的隐式和显式等待之间有什么区别。哪一个是驱动级等待。如果我们在代码中提供隐式和显式等待。哪一个优先。

  • CLANG6、CLANG7和gcc 7.1、7.2和7.3都同意以下代码是有效的C++17代码,但在C++14和C++11下有歧义。MSVC2015和2017也接受它。然而,即使在C++17模式下,GCC-8.1和8.2也拒绝了它: 接受它的编译器选择模板化的显式转换函数。 拒绝它的编译器同意在以下两个方面存在歧义: null 以下是来自(接受代码)的错误:

  • 我有一些以下模式的文本字符串。 > 此外,我还想捕获之后第一个

  • 我需要通过不在括号中的管道拆分文本。这是示例文本 我在这里找到了这个/\ |(?![^{]*})/g:regex,提取字符串,不要在两个括号之间 现在当我想用管子分割这部分字符串时 它还选择杰森、玛丽亚和圣诞老人之间的管道,因为它们后面有一个开口支架。如果正则表达式不在任何括号中,如何将其更改为仅匹配管道。 测试字符串: 应该返回 . 应该返回

  • 问题内容: 想要有关对象的某些调试信息时,我曾经使用toString的隐式调用,因为在对象为null的情况下,它不会引发Exception。 例如: 代替: 除了null以外,还有什么区别吗? 如果前者不起作用,后者可以工作吗? 编辑: 在隐式调用的情况下,到底做了什么? 问题答案: 没有什么区别。使用较短且经常使用的那一种。 如果您实际上由于其他原因想要获取对象的字符串值,并且希望它为null友

  • 问题内容: 我在使用Hibernate生成无效SQL时遇到问题。具体来说,混合和匹配隐式和显式联接。这似乎是一个开放的错误。 但是,我不确定 为什么 这是无效的SQL。我想出了一个生成相同语法异常的小型玩具示例。 架构图 数据 工作SQL 这两个查询均有效。我意识到有笛卡尔积;那是故意的。 明确加入: 隐式加入: 无效的SQL 此查询不适用于MSSQL 2000/2008或MySQL: 在MS20