专题3.条件和循环
1.条件语句-if(){}
1.1 只有if
代码语言:text复制# if()里的内容一定得是逻辑值,可以是你写上的T和F,也可以是运算结果
# 若运算结果为T或者你写上了T,他就会执行后续语句,反之则不执行
# 这边演示的代码较短,因此不加{}问题也不大
i = -1
if (i<0) print('up')
代码语言:txt复制## [1] "up"
代码语言:text复制if (i>0) print('up') # 这边就不会执行
1.1.1 利用if来进行长脚本管理
代码语言:text复制# 1.if(F){},则{}里的代码被跳过
# if(T){},则{}里的代码被运行
# 凡是带有{}的代码均可以被折叠
1.2 有else
这部分可以简单理解为如果...,就...,否则...
代码语言:text复制i = 1
if (i<0){
print('small')
} else {
print('big')
}
代码语言:txt复制## [1] "big"
代码语言:text复制# 翻译成中国话就是:i = 1,如果i<0,就输出小,否则就输出大。应该很好理解
1.3 ifelse(重点!)
代码语言:text复制# 3个参数
# ifelse(x,yes,no)
# x:逻辑值或者逻辑向量;yes:逻辑值为T时的返回值;no:逻辑值为F时的返回值
# 简单示范
i = 1
ifelse(i>0,' ','-')
代码语言:txt复制## [1] " "
代码语言:text复制# 灵活一些,取三个随机数康康
x = rnorm(3);x
代码语言:txt复制## [1] 0.1171687 -0.1286477 0.3504566
代码语言:text复制ifelse(x>0,' ','-')
代码语言:txt复制## [1] " " "-" " "
代码语言:text复制# 与字符检测函数str_detect()进行连用,用之前别忘记加载R包
library(stringr)
# 1.随便生成一个向量,取名样本。其中包含3个tumor和3个normal
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
# 2.利用str_detect()函数检测样本里的每个元素是否包含'normal'
k1 = str_detect(samples,"normal");k1
代码语言:txt复制## [1] FALSE FALSE FALSE TRUE TRUE TRUE
代码语言:text复制# 3.设置2分组'normal'和'tumor'
ifelse(k1,"normal","tumor")
代码语言:txt复制## [1] "tumor" "tumor" "tumor" "normal" "normal" "normal"
1.4 多个条件
代码语言:text复制# 说白了也离不开"如果...,就...,否则..."的局势
i = 0
if (i>0){ # 比较i是否大于0
print(" ") # 如果i大于0,就输出" "
} else if (i==0){ # 否则就比较i是否等于0
print("0") # 如果i等于0,就输出"0"
} else if (i<0){ # 否则就比较i是否小于0
print("-") # 如果i小于0,就输出"-",三种情况必满足一种
}
代码语言:txt复制## [1] "0"
代码语言:text复制# 用ifelse写
i = 0
ifelse(i>0," ",ifelse(i<0,"-","0")) # 简单的嵌套结构,大家可以先从看懂模仿开始
代码语言:txt复制## [1] "0"
补充:case_when()
代码语言:text复制# 用之前先加载R包dplyr
library(dplyr)
# 先来个简单的,case_when是按顺序进行判断的
i = 0
case_when(i>0 ~ " ", # 如果i大于0,就输出" "
i<0 ~ "-", # 如果i小于0,就输出"-"
T ~ "0") # 如果i等于0,就输出"0"。这边不写T也可以写"i = 0"
代码语言:txt复制## [1] "0"
代码语言:text复制# 切合实际地增加一丢丢难度
options(scipen = 20) # 因为看着不舒服,所以不让他以科学计数法显示
x = c(0.01,0.001,0.07,0.03,0.00001); x
代码语言:txt复制## [1] 0.01000 0.00100 0.07000 0.03000 0.00001
代码语言:text复制# 由于case_when按顺序进行判断,条件严格的往前写哈
# 这个用来看p值比较多
case_when(x <= 0.0001 ~ "****",
x <= 0.001 ~ "***",
x <= 0.01 ~ "**",
x <= 0.05 ~ "*",
x > 0.05 ~ "ns")
代码语言:txt复制## [1] "**" "***" "ns" "*" "****"
2.循环语句-for(){}
代码语言:text复制# 简单理解下
for( i in 1:4){ # i是称呼,前后对应,后面那个范围可自己调节
print(i) # 看下输出结果大家就应该知道啥意思了
}
代码语言:txt复制## [1] 1
## [1] 2
## [1] 3
## [1] 4
代码语言:text复制# 循环画图-以内置数据iris为例
par(mfrow = c(2,2)) # 将画板变成两行两列,这样四个图就会分别跑去四个角
for(i in 1:4){
plot(iris[,i], col = iris[,5])
}
代码语言:text复制#批量装包
pks = c("tidyr","dplyr","stringr")
for(g in pks){
if(!require(g,character.only = T)) # 只识别字符,这些参数大家不了解也问题不大
install.packages(g,ask = F,update = F) # 装包的时候别问问题别更新
}
引用自生信技能树