使用向量化的 if:ifelse
进行分支计算的一个替代方法是 ifelse( )。这个函数接收一个逻辑向量作为判定
条件,并且返回一个向量。对于逻辑判定条件内的每一个元素,若是 TRUE,则选择第 2
个参数 yes 中所对应的元素;若是 FALSE,则选择第 3 个参数 no 中所对应的元素。总而
言之,ifelse( ) 是 if 的向量化形式,如下所示:
ifelse(c(TRUE, FALSE, FALSE), c(1, 2, 3), c(4, 5, 6))
## [1] 1 5 6
既然 yes 和 no 两个参数可以循环使用,那么,可以就使用 ifelse( ) 重
写 check_positiv( ):
check_positive2 <- function(x){
ifelse(x,1,0)
}
check_positive( )(使用 if)和 check_positive2( )(使用 ifelse)之间的细微
差别在于:check_positive(−1) 不会明确返回某个值,而 check_positive2(−1) 则
会返回 0。当 if 语句只使用 if 而没有 else 时,无须明确返回某个值。相反,对
于 ifelse( ),因为需要指定 yes 和 no 这两个参数值,所以它总是返回一个向量。
另外,需要提醒的是,如果只是简单地将 ifelse( ) 和 if 相互替代,不能保证总是达到同
样的目的。举个例子,假设你希望基于某个条件得到一个两元素变量。如果我们使用 ifelse( ):
ifelse(TRUE, c(1, 2), c(2, 3))
## [1] 1
只返回了 yes 参数中的第 1 个元素。如果想返回 yes 参数,需要将条件改
为 c(TRUE, TRUE),只是这看起来有点别扭。
如果使用 if,看起来就自然多了:
if (TRUE) c(1, 2) else c(2, 3)
## [1] 1 2
如果要求向量化输入和输出,就会存在另一个问题:若 yes 参数是数值向量,而 no 参
数是字符向量,那么,一个混合了 TRUE 和 FALSE 的判定条件会将输出向量中的所有元素
强制转换为字符串,因此,返回结果是一个字符向量:
ifelse(c(TRUE, FALSE), c(1, 2), c("a", "b"))
## [1] "1" "b"
使用向量化的 if:ifelse的更多相关文章
- R语言学习笔记
向量化的函数 向量化的函数 ifelse/which/where/any/all/cumsum/cumprod/对于矩阵而言,可以使用rowSums/colSums.对于“穷举所有组合问题" ...
- R语言编程艺术(5)R语言编程进阶
本文对应<R语言编程艺术> 第14章:性能提升:速度和内存: 第15章:R与其他语言的接口: 第16章:R语言并行计算 ================================== ...
- Octave Tutorial(《Machine Learning》)之第五课《控制语句和方程及向量化》
第五课 控制语句和方程 For,while,if statements and functions (1)For loop v=zeros(10,1) %initial vectors for i=1 ...
- switch与ifelse的效率问题
switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的.从而,swi ...
- Matlab代码优化--向量化
前段时间改写老师的一个计算纳米细颗粒物的C语言程序,不过运行的效率实在是太低了,工作站跑都很吃劲,晚上看了冈萨雷斯的数字图像处理意外发现了问题所在.在将C语言的程序改写成Matlab程序的时候我还是保 ...
- JSTL的if-else表式
JSTL用法,这里不细讲了,主要是if-else的写法: 代码片段: <c:choose> <c:when test="${user.role eq 1 }"&g ...
- 关于消除if-else的简单总结
if-else是计算机语言中基本的分支语句,虽然很简单,但可能会出现滥用的情况,如图: 这种标记判断,嵌套成这样(其实没有必要嵌套),会让别人觉得作者水平很低. 可以看出,这些if仅仅是在判断一个变量 ...
- 第25章 SEH结构化异常处理_未处理异常及向量化异常
25.1 UnhandledExceptionFilter函数详解 25.1.1 BaseProcessStart伪代码(Kernel32内部) void BaseProcessStart(PVOID ...
- 深度学习入门教程UFLDL学习实验笔记二:使用向量化对MNIST数据集做稀疏自编码
今天来做UFLDL的第二个实验,向量化.我们都知道,在matlab里面基本上如果使用for循环,程序是会慢的一逼的(可以说基本就运行不下去)所以在这呢,我们需要对程序进行向量化的处理,所谓向量化就是将 ...
随机推荐
- 【Android】Android实现自定义带文字和图片的Button
在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就是利用系统自带的Button来实现,这种方式代码量最 ...
- java类的成员初始化顺序和初始化块知识
java类的成员初始化顺序和初始化块知识 转自:http://blog.csdn.net/lgfeng218/article/details/7606735 属性.方法.构造方法和自由块都是类中的成员 ...
- java后端技术栈
- 宝塔面板快速开启https服务
最近在做小程序开发,急需要一个https的域名,首先我的域名是阿里云的,服务器是腾讯云的,操作都一样: 无论阿里云还是腾讯云,配置SSL是针对服务器的,所以首先是要去申请 腾讯/阿里云服务器的SSL( ...
- vue 学习报错 Newline required at end of file but not found
着不敢了,原因竟然是需要在js css等后面再加一行(空行) Newline required at end of file but not found 翻译:文件末尾需要换行符,但找不到 如下面两处 ...
- Oracle管理监控 之 rac环境密码文件管理
密码文件作用: 密码文件用于dba用户的登录认证. dba用户:具备sysdba和sysoper权限的用户,即oracle的sys和system用户. RAC环境中多个节点的密码文件应该保证一致,否则 ...
- uboot ping doesn’t work
Ping doesn't work Ping from U-Boot to a host should work. Ping from a host to U-Boot should not. U-B ...
- c# 自定义控件之小小进度条
先看效果图: 非常简洁的一个进度条. 完整项目源码下载:http://files.cnblogs.com/files/tuzhiyuan/%E8%BF%9B%E5%BA%A6%E6%9D%A1%E6% ...
- 9.GIt删除操作
在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交: 创建一个文件test.txt,写入一句话`this is new file !`. $ echo ' ...
- C#基础整理(二)
1.变量类型int.double.string.char.bool.decimal变量使用规则:先声明,再赋值,最后使用 2.命名规范:Camel:第一个单词首字母小写,其他单词首字母大写,其余字母小 ...