上述例子的函数中,都只输入了单一值。如果我们提供一个向量,那么这个函数将产
生警告,这是因为 if 语句不能与多值向量共存。
check_ _positive(c(1,-1,0))
## Warning in if (x > 0) 1: 条件的长度大于一,因此只能用其第一元素
## [1] 1
从输出结果可以看到,if 语句忽视除第 1 个元素以外的所有元素,假如提供多值逻辑
向量的话:
num <- c(1,2,3)
if (num > 2){
cat("num > 2!")
}
## Warning in if (num > 2) {: 条件的长度大于 1,因此只能用其第一元素
这个表达式产生了一个警告,表明只使用第 1 个元素 (1 > 2)。实际上,当我们尝试将
一个表达式作用于逻辑向量时,该表达式的值会被 TRUE 和 FALSE 混淆而显得逻辑不清。
一些逻辑函数可以避免出现模棱两可的情况。举个例子,只要给定向量中有一个值
是 TRUE,any( ) 函数就会返回 TRUE:
any(c(TRUE,FALSE,FALSE))
## [1] TRUE
any(c(FALSE,FALSE))
## [1] FALSE
因此,如果我们确实想知道向量中是否存在大于 2 的值,就应该使用 any( ) 函数:
if (any(num > 2)) {
cat("num > 2!")
}
## num > 2!
类似地,如果想知道输出向量中是否所有值都大于 2,我们应该调用 all( ) 函数:
if (all(num > 2)) {
cat("num > 2!")
} else {
cat("Not all values are greater than 2!")
}
## Not all values are greater than 2!
因此,每次使用 if 表达式来分支工作流时,都要确保待判断条件是单值逻辑向量。
否则,就会出现一些意想不到的情况。
另一个例外是 NA,虽然它是单值逻辑向量,但稍不注意,就可能导致 if 条件报错:
check <- function(x) {
if(all(x > 0)){
cat("All input values are positive!")
} else {
cat("Some value are not positive!")
}
}
对于不存在缺失值的典型数值向量,check( ) 函数可以完美运行。然而,如果 x 中
存在缺失值,那么函数可能最终产生错误:
check(c(1,2,3))
## All input values are positive!
check(c(1,2,NA,-1))
## Some value are not positive!
check(c(1,2,NA))
## Error in if (all(x > 0)) {: 需要 TRUE/FALSE 值的地方不可以用缺少值
由此可知,当我们写 if 条件语句时应该小心缺失值。当逻辑复杂且输入数据多种多
样时,难以用恰当的方式简单绕地过缺失值。注意到 any( ) 和 all( ) 均可使
用 na.rm( )来处理缺失值。在写条件句的时候也应该考虑这个因素。
一个简化条件检查的方法是使用 isTRUE(x),它在内部调用 identical(TRUE,x)。
在这种情况下,只有一个单独的 TRUE 可以满足该条件,其他的值不会。

最新文章

  1. java之设计模式
  2. What every programmer should know about memory 笔记
  3. URL(待整合到HTTP书中哦)
  4. mysql高可用架构
  5. 往sql数据库表中添加字段
  6. ASP.NET Entity Framework with MySql服务器发布环境配置
  7. mysqldump命令的常用组合
  8. windows下搭建svn服务端、客户端
  9. UVa 10465 Homer Simpson (枚举)
  10. topshelf和quartz
  11. 【转】JSON和JSONP
  12. 【Linux】【MySQL】CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行)
  13. ionic3 导航的应用(页面跳转与参数传递)
  14. Visualforce控制器
  15. Unity shader学习之渐变纹理
  16. JavaScript BOM-11-BOM的核心-window对象; window对象的控制,弹出窗口方法; 超时调用; 间歇调用; location对象常用属性; 位置操作--location.reaplace,location.reload(); BOM中的history对象; Screen对象及其常用属性; Navigator对象;
  17. c# winform 获取当前程序运行根目录
  18. 【代码笔记】iOS-json文件的使用
  19. opencv项目报错_pFirstBlock==pHead解决办法
  20. LeetCode——Nim Game

热门文章

  1. android 点九工具介绍
  2. mybatis的&lt;choose&gt;和&lt;when&gt;、&lt;otherwise&gt;标签
  3. C++ 引用的辨别
  4. VirtualBox Guest Additions installation
  5. New Reform---cf659E(dfs找环)
  6. Python开发【数据结构】:基础
  7. 当Web访问性能出现问题,如何深探?
  8. 第1章 1.3计算机网络概述--规划IP地址介绍MAC地址
  9. mysql 数据操作 单表查询 where约束 like 模糊匹配
  10. js-template-art【一】简述