使用 if 表达式
由于 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 表达式的更多相关文章
- 【.net 深呼吸】细说CodeDom(2):表达式、语句
在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- 再讲IQueryable<T>,揭开表达式树的神秘面纱
接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...
- Linq表达式、Lambda表达式你更喜欢哪个?
什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...
- SQL Server-表表达式基础回顾(二十四)
前言 从这一节开始我们开始进入表表达式章节的学习,Microsoft SQL Server支持4种类型的表表达式:派生表.公用表表达式(CTE).视图.内嵌表值函数(TVF).简短的内容,深入的理解, ...
- 立即执行函数表达式(IIFE)
原文地址:benalman.com/news/2010/11/immediately-invoked-function-expression/ 译者:nzbin 也许你还没有注意到,我是一个对术语比较 ...
- javascript:逆波兰式表示法计算表达式结果
逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 - 等价于 5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
随机推荐
- angular -- ng-class该如何使用?
ng-class是一个判断是否给某一个元素添加类名的属性: 例如:下面是判断 是否添加 aHover 这个类名: <ul class="nav fl w120 o"> ...
- onethink判断是否是手机访问?
第一步:找到:Application / Common / Common / function.php 添加判断是否是手机访问的代码: /** * 判断当前访问的用户是 PC端 还是 手机端 返回tr ...
- Linux系列-Xshell连接本地VMware安装的Linux虚拟机
一.安装VMwareWorkstation并安装RedHat虚拟机,这里安装步骤省略,网络的资料很多,大侠们不如百度或者谷歌一下,大把的资料. 二.打开本地电脑的“网络连接”,你会发现多出了2个网络适 ...
- 在线预览文档(支持word、excel、ppt、pdf)+在线预览文档html版(转)
1.首先上网搜索一下有什么解决方案 (1).将文档转换为html,只支持支持office文档 (2).将文档转换为flash,实现类似百度文库的效果,除支持office文档外还支持pdf (1) a. ...
- 新版jquery的ajax调用 , jquery1.5以上
原文出处:http://api.jquery.com/jQuery.ajax/,该链接页面底部有代码展示 示例1: $.ajax({ method: "POST", url: &q ...
- Jquery Uploadify使用参数详解
开始上传 $('#uploadify_1').uploadifyUpload(); 1 uploader uploadify.swf文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击 ...
- idea 之git使用详细教程
安装 选择VersionControl下的Git,依据下图进行git配置 使用 荡项目 从VCS菜单选择checkout from version control-->git 更新项目 ...
- <sourceDirectory>src/main/java</sourceDirectory> mvn 配置 包路径
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...
- python控制台输出颜色
python_控制台输出带颜色的文字方法在开发项目过程中,为了方便调试代码,经常会向stdout中输出一些日志,默认的这些日志就直接显示在了终端中.而一般的应用服务器,第三方库,甚至服务器的一些通告也 ...
- Windows mysql默认字符集修改
一.通过MySQL命令行修改: set character_set_client=utf8; set character_set_connection=utf8; set character_set_ ...