进行分支计算的一个替代方法是 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的更多相关文章

  1. R语言学习笔记

    向量化的函数 向量化的函数 ifelse/which/where/any/all/cumsum/cumprod/对于矩阵而言,可以使用rowSums/colSums.对于“穷举所有组合问题" ...

  2. R语言编程艺术(5)R语言编程进阶

    本文对应<R语言编程艺术> 第14章:性能提升:速度和内存: 第15章:R与其他语言的接口: 第16章:R语言并行计算 ================================== ...

  3. Octave Tutorial(《Machine Learning》)之第五课《控制语句和方程及向量化》

    第五课 控制语句和方程 For,while,if statements and functions (1)For loop v=zeros(10,1) %initial vectors for i=1 ...

  4. switch与ifelse的效率问题

    switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的.从而,swi ...

  5. Matlab代码优化--向量化

    前段时间改写老师的一个计算纳米细颗粒物的C语言程序,不过运行的效率实在是太低了,工作站跑都很吃劲,晚上看了冈萨雷斯的数字图像处理意外发现了问题所在.在将C语言的程序改写成Matlab程序的时候我还是保 ...

  6. JSTL的if-else表式

    JSTL用法,这里不细讲了,主要是if-else的写法: 代码片段: <c:choose> <c:when test="${user.role eq 1 }"&g ...

  7. 关于消除if-else的简单总结

    if-else是计算机语言中基本的分支语句,虽然很简单,但可能会出现滥用的情况,如图: 这种标记判断,嵌套成这样(其实没有必要嵌套),会让别人觉得作者水平很低. 可以看出,这些if仅仅是在判断一个变量 ...

  8. 第25章 SEH结构化异常处理_未处理异常及向量化异常

    25.1 UnhandledExceptionFilter函数详解 25.1.1 BaseProcessStart伪代码(Kernel32内部) void BaseProcessStart(PVOID ...

  9. 深度学习入门教程UFLDL学习实验笔记二:使用向量化对MNIST数据集做稀疏自编码

    今天来做UFLDL的第二个实验,向量化.我们都知道,在matlab里面基本上如果使用for循环,程序是会慢的一逼的(可以说基本就运行不下去)所以在这呢,我们需要对程序进行向量化的处理,所谓向量化就是将 ...

随机推荐

  1. 百度地图api定位和导航简写

    function locate() { // 百度地图API功能 var map = new BMap.Map("allmap"); // 创建Map实例 var point = ...

  2. R语言NULL、NA、0

    0是假 NULL.NA无法辨认真假 除了以上3个其他的都是真 > if (NULL) print("OK") else print("Error") Er ...

  3. Hive sql语法详解

      Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQ ...

  4. 单源最短路(spfa),删边求和

    http://acm.hdu.edu.cn/showproblem.php?pid=2433 Travel Time Limit: 10000/2000 MS (Java/Others)    Mem ...

  5. 阅读笔记:A Few useful things to Know About machine Learning

    这是Machine Learning领域的经典论文,文中提到了ML相关的12个keys,并自称这些keys是“black art”,我觉得有点像ML的“最佳实践”. 网上有此文的中文翻译,写得很详细, ...

  6. postgresql----Gist索引

    GiST的意思是通用的搜索树(Generalized Search Tree). 它是一种平衡树结构的访问方法,在系统中作为一个基本模版,可以使用它实现任意索引模式.B-trees, R-trees和 ...

  7. Groovy中的面向对象

    Groovy中的面向对象 前面说到groovy支持脚本和类,前面一节已将简单说了脚本和类之间的关系,这一节主要介绍一下groovy中类的相关知识,即面向对象相关知识. 1.类型 1.1 原始类型 gr ...

  8. Oracle在linux下命令行无法使用退格键退格,无法使用上下键切换历史命令的解决办法

    使用xshell等客户端登录oracl时在命令行无法使用退格键也无法使用上下键切换历史命令可以使用rlwrap解决 1,linux环境 2,下载rlwrap wget http://files.cnb ...

  9. 导出Excel过程中遇到的问题java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException

    尝试实现java导出功能时遇到如下报错: org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.No ...

  10. java网络编程面试题

    1.网络编程时的同步.异步.阻塞.非阻塞? 同步:函数调用在没得到结果之前,没有调用结果,不返回任何结果.异步:函数调用在没得到结果之前,没有调用结果,返回状态信息.阻塞:函数调用在没得到结果之前,当 ...