条件语句和循环语句
当你说话时候用到了如果,此时条件出现了
举个条件函数的例子
sign_t<-function(x){ if(x>0){ return(1) }else if(x<0){ return(-1) }else{ return(0) } } sign_t(5) #[1] 1
这是简单问题,复杂的问题,不行就把需求写下来,计算机语言不过就是傻瓜式的执行你要做的事情,本来是用来减少重复操作的,语言都一样,星星你要加油喽,把之前没学过的补回来
泛化的结构
if (condition1){ express1 } else if (condition2){ express2 } else if (condition3){ express3 }... }else (condition final){ express final } }
x写一个成绩的小的demo
> grade<-function(name,score){ + if (score<70){ + return("D") + }else if (score>=70&&score<80){ + return("C") + }else if (score>=80&&score<90){ + return("B") + }else { + return("A") + } + } > grade(89) [1] "B" > 另一个小demo namegrade<-function(name,score){ + grade<- + if (score<70) "D" + else if (score>=70&&score<80) "C" + + else if (score>=80&&score<90) "B" + + else "A" + + cat("the grade of",name,"is",grade) + } > namegrade("jhon",89) the grade of jhon is B 再来一个 gradename<-function(name,score){ if (score<70){ grade<-"D" cat("what a pity!\n") }else if (score>=70&&score<80){ grade<-"C" }else if (score>=80&&score<90) { grade<-"B" }else{ grade<-"A" cat("good\n") } cat("the grade of",name,"is",grade) } gradename("xing",90) ##good the grade of xing is A
因为if的本质是一个原函数,它的返回值就是满足条件分支表达式的值,所以这个表达式也可以作为内联函数
sign_1<-function(x){ + if (x>0) 1 else if (x<0) -1 else 0 + } > sign_1(5) [1] 1 >
ifelse
这个函数接受一个逻辑向量作为判定条件,并且返回一个向量,对于逻辑判定条件内的每一个元素,若是true,则选择第2个参数yes中所对应的元素,若是FALSE
,则选择第3个参数no中对应的元素
小demo
ifelse(c(TRUE,FALSE,FALSE),c(1,2,3),c(4,5,6)) [1] 1 5 6
switch 略
循环表达式
官方解释:
循环(或者迭代)通过迭代一个向量(for)或检查某个条件是否被违背(while)来重复执行某个表达式
若只是在输入值上做一些改变,而要重复执行同样的任务,目的是为了减少冗余代码
使用for循环
for循环通过迭代一个给定向量或者列表,重复执行某个表达式
语法格式
```{r}
for (var in vector){
expr
}
var 遍历vector中的各个元素的值,expr,被反复迭代执行,如果vector中有n个元素,那这个表达式等价于
var<-vector[[1]]
expr
var<-vector[[2]]
expr
var<-vector[[3]]
expr
来个小demo
> for (i in 1:3){ + cat("the value of i is ",i,"\n") + } the value of i is 1 the value of i is 2 the value of i is 3
当然啦,迭代可以作用于所有类型的向量,不仅仅是数值型的向量
for (word in c("hello","new","world")){ cat("the word is",word,"\n") }
或者是迭代一个列表
> loop_list<-list( + a=c(1,2,3), + b=c("a","b","c","d")) > for (item in loop_list){ + cat("item:\n lenhth:",length(item),"\n class:",class(item),"\n") + } item: lenhth: 3 class: numeric item: lenhth: 4 class: character
在迭代一个数据框的时候可以看成一个列表,但是注意数据框的列(元素)长度要一致,默认迭代的话是按照列执行的
来个小demo
> df<-data.frame( + x=c(1,2,3), + y=c("a","b","c"), + stringsAsFactors = FALSE) > for (col in df){ + str(col) + } num [1:3] 1 2 3 chr [1:3] "a" "b" "c"
后面可以学一下apply函数,map,要比for好使
有时候可以利用循环外的变量来记录迭代状态或累积过程,比如求100内的和
> s<-0 > for(i in 1:100){ + s<-s+i + } > s [1] 5050
简单的模拟一下随机游走的过程
> set.seed(123) > x<-numeric(1000) > for (t in 1:(length(x)-1)){ + x[[t+1]]<-x[[t]]+rnorm(1,0,0.1) + } > plot(x,type="s",main="Random walk",xlab="t")
有时候 可以中断for循环
> for (i in 1:5){ + if(i==3) break + cat("message",i,"\n") + } message 1 message 2
另外可以使用next函数跳过本次迭代剩余的部分
> for (i in 1:5){ + if(i==3) next + cat("message",i,"\n") + } message 1 message 2 message 4 message 5
循环嵌套
俩for循环套一起,常见应用,乘法口诀表
> for(i in 1:9){ + for(j in 1:9){ + cat("i*j=",i*j,"\n") + } + + } i*j= 1 i*j= 2 i*j= 3 i*j= 4 i*j= 5 i*j= 6 i*j= 7 i*j= 8 i*j= 9 i*j= 2 i*j= 4 i*j= 6 i*j= 8 i*j= 10 i*j= 12 i*j= 14 i*j= 16 i*j= 18 i*j= 3 i*j= 6 i*j= 9 i*j= 12 i*j= 15 i*j= 18 i*j= 21 i*j= 24 i*j= 27 i*j= 4 i*j= 8 i*j= 12 i*j= 16 i*j= 20 i*j= 24 i*j= 28 i*j= 32 i*j= 36 i*j= 5 i*j= 10 i*j= 15 i*j= 20 i*j= 25 i*j= 30 i*j= 35 i*j= 40 i*j= 45 i*j= 6 i*j= 12 i*j= 18 i*j= 24 i*j= 30 i*j= 36 i*j= 42 i*j= 48 i*j= 54 i*j= 7 i*j= 14 i*j= 21 i*j= 28 i*j= 35 i*j= 42 i*j= 49 i*j= 56 i*j= 63 i*j= 8 i*j= 16 i*j= 24 i*j= 32 i*j= 40 i*j= 48 i*j= 56 i*j= 64 i*j= 72 i*j= 9 i*j= 18 i*j= 27 i*j= 36 i*j= 45 i*j= 54 i*j= 63 i*j= 72 i*j= 81 咋这么奇怪???
for循环虽然很好用,但是应该优先考虑内置函数,比如lapply等