与很多编程语言一样,if 表达式用来处理逻辑条件。在 R 中,逻辑条件通常表达为某
个表达式返回的单值逻辑向量。例如,我们可以写一个简单的函数 check_positive,
如果输入一个正数则返回 1,否则不返回任何值:
check_positive <- function(x) {
if (x > 0) {
return(1)
}
}
上述函数中,x>0 就是需要检查的条件。如果满足这个条件,则函数返回 1。我们用
不同的输入值来验证一下:
check_ _positive(1)
## [1] 1
check_ _positive(0)
可以看出,函数的运行结果正如我们所期待的那样。如果加入一些 else if 和 else 分
支语句,这个函数就可以泛化为符号函数,即输入正数返回 1,输入负数返回−1,输入 0
返回 0:
check_sign <- function(x) {
if (x > 0) {
return(1)
} else if (x < 0) {
return(-1)
} else {
return(0)
}
}
上述函数具有与内置函数 sign( ) 相同的功能。为了验证它的逻辑,我们只需在调
用函数时,提供不同的输入值,分别满足函数的各个分支条件:
check_ _sign(15)
## [1] 1
check_ _sign(-3.5)
## [1] -1
check_ _sign(0)
## [1] 0
若要求函数不返回任何值,那么,我们可以根据相应条件控制函数不输出结果(更

确的说是返回 NULL)。下面的函数就不会明确返回一个值,而是向控制台发送一条消息。
消息的种类取决于输入值的符号:
say_sign <- function(x) {
if (x > 0) {
cat("The number is greater than 0")
} else if (x < 0) {
cat("The number is less than 0")
} else {
cat("The number is 0")
}
}
我们可以用类似的方法测试 say_sign( ) 函数的逻辑:
say_ _sign(0)
## The number is 0
say_ _sign(3)
## The number is greater than 0
say_ _sign(-9)
## The number is less than 0
if 分支语句的工作流是非常直观的:
1.首先,检查第 1 条语句 if (cond1) {expr1} 的条件 cond1;
2.若 cond1 为 TRUE,则执行其对应表达式{expr1};
否则,转向下一个分支语句 else if (cond2),并检查条件 cond2;依此类推;
3.如果违背了所有 if 和 else if 分支条件,则执行 else 分支表达式(如果有的话)。
由此推断,if 语句或许比你想象的更加灵活。例如,if 可以用在如下形式中。
最简单的形式就是一个简单的 if 语句分支:
if (cond1) {
# do something
}
一种稍复杂些的形式是用一个 else 分支来处理 cond1 的返回值不是 TRUE 的情况:
if (cond1) {
# do something
} else {
# do something else
}
一种更复杂的形式就是有一个或多个 else if 分支:
if (cond1) {
expr1
} else if (cond2) {
expr2
} else if (cond3) {
expr3
} else {
expr4
}
在上述条件分支中,分支条件(cond1、cond2 和 cond3)可能是相关的或不相关的。
例如,简单的成绩分级体系完全符合上述模板中的这种分支逻辑,每一个分支条件都是对
分数的一次切片操作:
grade <- function(score) {
if (score >= 90) {
return("A")
} else if (score >= 80) {
return("B")
} else if (score >= 70) {
return("C")
} else if (score >= 60) {
return("D")
} else {
return("F")
}
}
c(grade(65), grade(59), grade(87), grade(96))
## [1] "D" "F" "B" "A"
在这种情况下,每执行一个 else if 分支条件,实际上都隐含了假设该分支前面的条件
不成立。也就是说 score >=80 实际上是指score < 90 并且 score >= 80,它依赖于前
面的条件。因此,除非明确说明所有分支都相互独立,否则我们不能改变这些分支语句的顺序。
假设改变一些分支语句的顺序:
grade2 <- function(score) {
if (score >= 60) {
return("D")
} else if (score >= 70) {
return("C")
} else if (score >= 80) {
return("B")
} else if (score >= 90) {
return("A")
} else {
return("F")
}
}
c(grade2(65), grade2(59), grade2(87), grade2(96))
## [1] "D" "F" "D" "D"
显然,只有 grade(59) 得到了正确的分组,其他都是错误的。如果想在不重新排序
的情况下调用这个函数,我们需要重写判断条件以使其不依赖于检查顺序:
grade2 <- function(score) {
if (score >= 60 && score < 70) {
return("D")
} else if (score >= 70 && score < 80) {
return("C")
} else if (score >= 80 && score < 90) {
return("B")
} else if (score >= 90) {
return("A")
} else {
return("F")
}
}
c(grade2(65), grade2(59), grade2(87), grade2(96))
## [1] "D" "F" "B" "A"
这使得函数比正确形式繁琐许多。因此,找出分支条件的正确顺序,并注意各个分支
之间的依赖性是十分重要的。
好在 R 提供了一些函数,如 cut( ),可以很方便地达到同样的效果。输入 ?cut 来
阅读帮助文档以获取更多详细信息。

使用 if 语句的更多相关文章

  1. python第六天 函数 python标准库实例大全

    今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...

  2. whdxlib

    1 数据库系统实现 实 验 指 导 书 齐心 彭彬 计算机工程与软件实验中心 2016 年 3 月2目 录实验一.JDBC 应用程序设计(2 学时) ......................... ...

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

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

  4. 将表里的数据批量生成INSERT语句的存储过程 增强版

    将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...

  5. mysql学习之 sql语句的技巧及优化

    一.sql中使用正则表达式 select name,email from user where email Regexp "@163[.,]com$"; sql语句中使用Regex ...

  6. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

    Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...

  7. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  8. Oracle 数据库语句大全

    Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...

  9. MyBatis源码分析(二)语句处理器

    StatementHandler 语句处理器,主要负责语句的创建.参数的设置.语句的执行.不负责结果集的处理. Statement prepare(Connection connection, Int ...

  10. 一条Sql语句分组排序并且限制显示的数据条数

    如果我想得到这样一个结果集:分组排序,并且每组限定记录集的数量,用一条SQL语句能办到吗? 比如说,我想找出学生期末考试中,每科的前3名,并按成绩排序,只用一条SQL语句,该怎么写? 表[TScore ...

随机推荐

  1. 证书:数字签名和验签&加密和解密

    用的是湖北省数字证书认证管理中心的签名和加密 1.带私钥的证书,即p12格式证书(后缀为.pfx) 2.不带私钥的证书,有多种格式,通常我们使用的是cer格式证书(后缀为.cer) 一. 1.什么是对 ...

  2. mysql数据库LOAD DATA INFILE Syntax

    1.LOAD DATA INFILE用来把一个文本文件里的内容高速写入到MySQL表里,它和SELECT ... INTO FILE的操作是对应的,一个导入.一个导出.使用LOAD DATA INFI ...

  3. 【巷子】:关于Apply、call、bind的详解

    call方法: 语法:call(thisObj,'',''........) 定义:调用一个对象的一个方法,以另一个对象替换当前对象 说明:call方法可以用来代替另一个对象调用一个方法.call方法 ...

  4. 安装MySQL与安装Hive

    安装mysql 检查是否安装mysql: rpm -qa |grep mysql 删除已经安装的mysql: rpm -e mysql-libs-5.1.71-1.el6.x86_64 报错:因为my ...

  5. 解决Uploadify 3.2上传控件加载导致的GET 404 Not Found问题

    http://www.uploadify.com/forum/#/discussion/7329/uploadify-v3-bug-unecessary-request-when-there-is-n ...

  6. Linux环境下proc的配置c/c++操作数据库简单示例

    在虚拟机上装了oracle11g数据库,原本想利用c/c++学习操作数据库.结果感觉摊上了一个大坑.从安装好oracle数据库到配置好proc的编译选项整整花了二天.但让我意识到自己自己几点薄弱:1. ...

  7. 洛谷P3067 平衡的奶牛群 [USACO12OPEN] meet-in-the-middle

    正解:搜索 解题报告: 先放下传送门QwQ 这题就,双向搜索经典题鸭 首先dfs应该挺好想到的我jio得?就是我们不用记录左右分别得分多少只要记下差值就好了嘛能get? 然后就先搜左边,记录下每个得分 ...

  8. nginx 与 浏览器缓存

    一.本地静态文件 location /html/{ rewrite ^(html/.*)$ /$1 break; root /data/static; expires 12h; etag off; i ...

  9. Spring、springmvc配置

    首先把三个文件copy到resources目录下: 然后把这两个文件copy到WEB-INF下: 在datasource.properties中增加: db.driverLocation=C:\\Us ...

  10. PID参数调整的口诀

    PID参数调整的口诀:参数整定找最佳,从小到大顺序查先是比例后积分,最后再把微分加曲线振荡很频繁,比例度盘要放大曲线漂浮绕大湾,比例度盘往小扳曲线偏离回复慢,积分时间往下降曲线波动周期长,积分时间再加 ...