使用向量化的 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循环,程序是会慢的一逼的(可以说基本就运行不下去)所以在这呢,我们需要对程序进行向量化的处理,所谓向量化就是将 ...
随机推荐
- Python 中的map函数,filter函数,reduce函数
自学python,很多地方都需要恶补. 三个函数比较类似,都是应用于序列的内置函数.常见的序列包括list.tuple.str. 1.map函数 map函数会根据提供的函数对指定序 ...
- goole进不去?
1.把hosts文件放到C:\Windows\System32\drivers\etc目录下就可以上了.hosts文件自己下载 2. 上vpn ,注册个账号,每个账号500M的FQ流量也可以
- Python爬虫scrapy-redis分布式实例(一)
目标任务:将之前新浪网的Scrapy爬虫项目,修改为基于RedisSpider类的scrapy-redis分布式爬虫项目,将数据存入redis数据库. 一.item文件,和之前项目一样不需要改变 # ...
- namenode 问题小记
问题1:namenode进程故障 Namenode挂掉,Namenode gc日志里面YGC报错promotion failed 现象描述 NameNode进程挂掉,Namenode gc日志里面YG ...
- Cocos2d-JS实现的贪吃蛇
一.前言 相信贪吃蛇大家都玩儿过,我对贪吃蛇的印象就是在电子词典上,一只像素蛇在屏幕游走,饥渴难耐,看着豆子就要去吃,吃到豆子就会长一节,当蛇的身体越来越长的时候,它才发现这个世界变了,每走一步,都是 ...
- 4.3 Routing -- Generated Objects
就像在routing guide中介绍的那样,不管什么时候你在路由器中定义一个新路径,Ember.js就会尝试寻找一个对应的route,controller,template,它们的命名都是根据命名约 ...
- cocos-lua基础学习(九)spite类学习笔记
创建精灵 ,) ) layer:addChild( sprite ) ) layer:addChild(BatchNode, , kTagSpriteBatchNode) ,) ) layer:add ...
- hdu5102 枚举每条边的长度
题意 给了 一颗 有 100000 个节点的树, 他们构成的边有 n*(n-1)/2 种. 每条边有一个长度,长度排序后 取前K条的 和, 枚举每条长度为1 的边 放进队列,然后通过成都为1 的表去 ...
- 【UI】android如何绘制一个饼图
代码下载 需求 1:实心饼图,颜色填充百分比区域 2:带区域说明 3:饼图有阴影 思路:这个其实和绘制进度条原理差不多,都是360度根据所占百分比算出绘制弧度,然后调用canvas的画弧函数. 阴影其 ...
- Linux命令: grep命令
基本用法 ...