由于 if 本质上是一个原函数,它的返回值就是满足条件分支表达式的值,因此,if 表
达式也可以用作内联函数。我们以 check_positive( )为例进行说明。尽管条件表达式
中不另写 return( ) 语句,也可以得到函数体中 if 表达式的返回值,从而达到与包
含 return( ) 同样的效果:
check_positive <- function(x) {
return(if (x > 0) {
1
})
}
事实上,这个表达式可以简化为一行:
check_positive <- function(x) {
return(if (x > 0) 1)
}
由于函数的返回值就是函数体中最后一个表达式的值,所以在这种情况下,我们可以
删掉 return( ) 语句:
check_positive <- function(x) {
if (x > 0) 1
}
同样的原则也适用于 check_sign( ) 函数。一个简单形式如下所示:
check_sign <- function(x) {
if (x > 0) 1 else if (x < 0) -1 else 0
}
为了清楚地理解 if 表达式的值,我们可以编写一个成绩报告函数,给定一个学生的
姓名和分数,该函数就可以报告这个学生的成绩等级:
say_grade <- function(name, score) {
grade <- if (score >= 90) "A"
else if (score >= 80) "B"
else if (score >= 70) "C"
else if (score >= 60) "D"
else "F"
cat("The grade of", name, "is", grade)
}
say_ _grade("Betty", 86)
## The grade of Betty is B
使用 if 语句作为表达式看起来似乎更紧凑、简洁。但在实践中,我们很少遇到所有
条件都是简单的数值比较且最终只需返回一个值的情况。对于更复杂的条件和分支,建议
使用 if 作为一个语句来清楚地声明不同的分支,也不要省略{ },以免不必要错误。下面
的函数就是一个反例:
say_grade <- function(name, score) {
if (score >= 90) grade <- "A"
cat("Congratulations!\n")
else if (score >= 80) grade <- "B"
else if (score >= 70) grade <- "C"
else if (score >= 60) grade <- "D"
else grade <- "F"
cat("What a pity!\n")
cat("The grade of", name, "is", grade)
}
编写这个函数的人本想给各个分支添加说明,但在分支表达式中没有使用 { } 括号,
因此很有可能产生语法错误。如果你在控制台中运行上述代码,产生的错误信息足以让你
困惑一段时间:
>say_grade <- function(name, score) {
+ if (score >= 90) grade <- "A"
+ cat("Congratulations!\n")
+ else if (score >= 80) grade <- "B"
Error: unexpected 'else' in:
" cat("Congratulations!\n")
else"
> else if (score >= 70) grade <- "C"
Error: unexpected 'else' in " else"
> else if (score >= 60) grade <- "D"
Error: unexpected 'else' in " else"
> else grade <- "F"
Error: unexpected 'else' in " else"
> cat("What a pity!\n")
What a pity!
> cat("The grade of", name, "is", grade)
Error in cat("The grade of", name, "is", grade) : object 'name' not found
> }
Error: unexpected '}' in "}"
一种更好的函数形式可以避免这种潜在的陷阱,如下所示:
say_grade <- function(name, score) {
if (score >= 90) {
grade <- "A"
cat("Congratulations!\n")
} else if (score >= 80) {
grade <- "B"
}
else if (score >= 70) {
grade <- "C"
}
else if (score >= 60) {
grade <- "D"
} else {
grade <- "F"
cat("What a pity!\n")
}
cat("The grade of", name, "is", grade)
}
say_ _grade("James", 93)
## Congratulations!
## The grade of James is A
这个函数可能看起来有些繁琐,但它的逻辑更清晰,具备更高的稳健性。记住,正确
总是比简短更重要。

使用 if 表达式的更多相关文章

  1. 【.net 深呼吸】细说CodeDom(2):表达式、语句

    在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...

  2. 你知道C#中的Lambda表达式的演化过程吗?

    那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...

  3. 再讲IQueryable<T>,揭开表达式树的神秘面纱

    接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...

  4. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  5. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  6. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

  7. SQL Server-表表达式基础回顾(二十四)

    前言 从这一节开始我们开始进入表表达式章节的学习,Microsoft SQL Server支持4种类型的表表达式:派生表.公用表表达式(CTE).视图.内嵌表值函数(TVF).简短的内容,深入的理解, ...

  8. 立即执行函数表达式(IIFE)

    原文地址:benalman.com/news/2010/11/immediately-invoked-function-expression/ 译者:nzbin 也许你还没有注意到,我是一个对术语比较 ...

  9. javascript:逆波兰式表示法计算表达式结果

    逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 -  等价于   5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...

  10. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

随机推荐

  1. Linux系统下JDK安装配置(转载)

    转载出处:http://www.cnblogs.com/xuliangxing/p/7066913.html 本文主要介绍的是如何是Linux环境下安装JDK的,因为Linux环境下,很多时候也离不开 ...

  2. 170704、springboot编程之CommandLineRunner

    实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来 ...

  3. ZOJ 80ers' Memory

    80ers' Memory Time Limit: 1 Second      Memory Limit: 32768 KB I guess most of us are so called 80er ...

  4. poj2376 Cleaning Shifts【线段树】【DP】

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32561   Accepted: 7972 ...

  5. 白话陈述之——从python脚本变化解析由路径引起的GP服务运行失败问题

    补充一下未完待续的利用Python分析GP服务运行结果的输出路径 & 实现服务输出路径的本地化,这篇博客中主要介绍了如何实现将GP服务生成的结果输出至本地及输入输出路径导致GP服务运行失败的问 ...

  6. <sourceDirectory>src/main/java</sourceDirectory> mvn 配置 包路径

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  7. Python开发【模块】:BeautifulSoup

    BeautifulSoup BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XM ...

  8. windos 查看指定端口,将指定进程杀死

    >netstat -aon | findstr “80″ Proto   Local Address           Foreign Address         State        ...

  9. 记录:EPALN Electric P8 2.4.4.8366 安装记录

    系统:win7  32位 旗舰版.  (原版系统 非GHOST) 第一步:解压安装. setup.exe 右击 选择 注意:把  360  百度 杀毒之类的全部关闭 第二步: 第三步: 第四步: 第五 ...

  10. SLG手游Java服务器的设计与开发——网络通信

    文章版权归腾讯GAD所有,禁止匿名转载:禁止商业使用:禁止个人使用. 一.前言 上文分析了我们这款SLG的架构,本章着重讲解我们的网络通信架构,由上文的功能分析我们可以得知,游戏的所有功能基本上属于非 ...