上述例子的函数中,都只输入了单一值。如果我们提供一个向量,那么这个函数将产
生警告,这是因为 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 可以满足该条件,其他的值不会。

在 if 条件句中使用向量的更多相关文章

  1. 2016/1/12 第一题 输出 i 出现次数 第二题 用for循环和if条件句去除字符串中空格 第三题不用endwith 实现尾端字符查询

    import java.util.Scanner; public class Number { private static Object i; /* *第一题 mingrikejijavabu中字符 ...

  2. 3d中的向量

    向量基础知识 向量有且仅有的两个属性:方向长度(注意:向量性情中不包含位置信息) 向量相等就是其两个属性相等 向量处理标记位置:当向量的起始点与坐标原点重合,这样我们就可以用向量的终点坐标来描述一个处 ...

  3. 【shell 练习1】编写Shell条件句练习

    实例一.比较两个整数大小 #!/bin/bash while true do read -p "Please input two int nums:" a b >/dev/& ...

  4. 计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具

    计算机图形学 opengl版本 第三版------胡事民 第四章  图形学中的向量工具 一   基础 1:向量分析和变换   两个工具  可以设计出各种几何对象 点和向量基于坐标系定义 拇指指向z轴正 ...

  5. Mysql 查询出某列字段 被包含于 条件数据中

    我们通常是使用  某条件  是否包含于 某列中   ,简单点 就是:select * from 表名 where  字段名 like '%条件数据%'; 现在说下   某列 被包含于 条件数据中 接下 ...

  6. 在条件判断中使用 all() / any()

    在条件判断中使用 all() / any() all() 和 any() 两个函数非常适合在条件判断中使用.这两个函数接受一个可迭代对象,返回一个布尔值,其中: all(seq):仅当 seq 中所有 ...

  7. 将一个多表关联的条件查询中的多表通过 create select 转化成一张单表的sql、改为会话级别临时表 【我】

    将一个多表关联的条件查询中的多表通过 create   select  转化成一张单表的sql 将结果改为创建一个会话级别的临时表: -- 根据下面这两个sql CREATE TABLE revenu ...

  8. java中的case里嵌套if条件句; 输入一个年份的某一个月份,判断这个月有多少天

    public class year {    public static void main(String arg[]){        Scanner a=new Scanner(System.in ...

  9. 从NLP任务中文本向量的降维问题,引出LSH(Locality Sensitive Hash 局部敏感哈希)算法及其思想的讨论

    1. 引言 - 近似近邻搜索被提出所在的时代背景和挑战 0x1:从NN(Neighbor Search)说起 ANN的前身技术是NN(Neighbor Search),简单地说,最近邻检索就是根据数据 ...

随机推荐

  1. chrome inspect 离线调试-工具包 怎么使用

    1.找到相关目录: C:\Users\当前用户\AppData\Local\Google\Chrome\User Data\Default 2.找到以下文件夹: 1.Application Cache ...

  2. linux本机root账户无法登录,但是远程ssh可登录

    1.故障状态 a.linux本机root账户无法登录(root和密码无误的情况下也无法登录,但是用远程ssh软件可以登录) b.查看/var/log/secure登录日志(提示无法找到pam_limi ...

  3. 微信小程序 --- action-sheet底部弹框

    action-sheet:从屏幕底部弹出一个菜单,选择: 使用的时候,在给不同的 action-sheet-item 添加不同的事件. 效果: (这里的确定可以有多个) 代码: <button ...

  4. R的替换sub和gsub

    sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE) gsu ...

  5. Pentaho Report Designer 数据大于某值显示红色

    在细节栏中的字段的属性, 在样式的text-color,右边的表达式 输入下面表达式即可! =IF( [ALL_VALUE] > 50 ; "black" ; IF([ALL ...

  6. HDU Palindrome subsequence(区间DP)

    Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/Oth ...

  7. 全角半角符号引发的Entity Framework奇遇记

    SQL Server的SQL查询不区分大小写,而LINQ查询区分大小写,所以在写LINQ代码时需要注意的是——如果这段LINQ代码将会被Entity Framework解析为SQL语句(LINQ to ...

  8. python问答模块

    """ 该模块功能:获取用户的输入文本,通过输入文本和数据库中的关键主题文本相比较, 获取最佳的回答内容 """ import xlrd i ...

  9. MySQL慢查询日志工具mysqlsla

    mysql数据库的慢查询日志是非常重要的一项调优辅助日志,但是mysql默认记录的日志格式阅读时不够友好,这是由mysql日志记录规则所决定的,捕获一条就记录一条,虽说记录的信息足够详尽,但如果将浏览 ...

  10. python re.sub 括号匹配替换匹配到的内容后接数字

    如果代码为: text = re.sub(r'(?<=[{])([a-z]+)6(?=[}])', r'\13', text) 上面代码会报错,因为没有组合13,所以不能获得组合13的内容. 但 ...