条件语句和循环语句

当你说话时候用到了如果,此时条件出现了

举个条件函数的例子

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循环通过迭代一个给定向量或者列表,重复执行某个表达式

语法格式

for (var in vector){
expr
}
var 遍历vector中的各个元素的值,expr,被反复迭代执行,如果vector中有n个元素,那这个表达式等价于
var<-vector[[1]]
expr
var<-vector[[2]]
expr
var<-vector[[3]]
expr 来个小demo
```{r}
> 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等

while循环 略

notes:

在循环中:

break语句是跳出循环不再往后执行了,

next语句是跳出本次循环,进行下一次的迭代

这俩直接用就可以了,不用加()

R语言函数化学习笔记4的更多相关文章

  1. R语言函数化学习笔记6

    R语言函数化学习笔记 1.apply函数 可以让list或者vector的元素依次执行一遍调用的函数,输出的结果是list格式 2.sapply函数 原理和list一样,但是输出的结果是一个向量的形式 ...

  2. R语言函数化学习笔记3

    R语言函数化学习笔记3 R语言常用的一些命令函数 1.getwd()查看当前R的工作目录 2.setwd()修改当前工作目录 3.str()可以输出指定对象的结构(类型,位置等),同理还有class( ...

  3. R语言函数化编程笔记2

    R语言函数化编程笔记2 我学过很多的编程语言,可以我写的代码很啰嗦,一定是我太懒了.或许是基础不牢地动山摇 1.为什么要学函数 函数可以简化编程语言,减少重复代码或者说面向对象的作用 2.函数 2.1 ...

  4. R语言函数化编程笔记1

    R语言函数化编程笔记1 notes:有一个不错的网站叫做stack overflow,有问题可以从上面找或者搜索答案,会有大佬相助. 在github上面可以找到很多R的扩展包,如果自己额修改被接受,那 ...

  5. R语言函数话学习笔记5

    使用Tidyverse完成函数化编程 (参考了家翔学长的笔记) 1.magrittr包的使用 里面有很多的管道函数,,可以减少代码开发时间,提高代码可读性和维护性 1.1 四种pipeline 1.1 ...

  6. R语言与机器学习学习笔记

    人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自 ...

  7. R语言与显著性检验学习笔记

    R语言与显著性检验学习笔记 一.何为显著性检验 显著性检验的思想十分的简单,就是认为小概率事件不可能发生.虽然概率论中我们一直强调小概率事件必然发生,但显著性检验还是相信了小概率事件在我做的这一次检验 ...

  8. 【数据分析 R语言实战】学习笔记 第十一章 对应分析

    11.2对应分析 在很多情况下,我们所关心的不仅仅是行或列变量本身,而是行变量和列变量的相互关系,这就是因子分析等方法无法解释的了.1970年法国统计学家J.P.Benzenci提出对应分析,也称关联 ...

  9. 【数据分析 R语言实战】学习笔记 第四章 数据的图形描述

    4.1 R绘图概述 以下两个函数,可以分别展示二维,三维图形的示例: >demo(graphics) >demo(persp) R提供了多种绘图相关的命令,可分成三类: 高级绘图命令:在图 ...

随机推荐

  1. 如何在GitHub预览html

    1.在GitHub中找到需要预览的html文件,点击settings 2.找到GitHub Pages,将其中的source改为master branch,此时出现了下图中的红色链接,打开一个新的网页 ...

  2. axios中qs的使用

    首先qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装. 地址: https://www.npmjs.com/package/qs qs.parse().qs.string ...

  3. bootstrap组件---进度条

    <div class="progress"> <div class="progress-bar progress-bar-success" r ...

  4. VueJs一步步实现带感的帮助面板

    环境 IDE: WebStorm 2019.1.4 系统: Mac OS X 10.15.4 VueJs: 2.6.11 Vue-cli: 4.2.2 前言   最近一直在忙毕设,前端终于还是对我这个 ...

  5. Linux运维---1.Ceph分布式存储架构及工作原理

    Ceph理论 Ceph 简介 Ceph 是一个开源项目,它提供软件定义的.统一的存储解决方案 .Ceph 是一个具有高性能.高度可伸缩性.可大规模扩展并且无单点故障的分布式存储系统 . Ceph 是软 ...

  6. html文件如何下载文件

    HTML中下载文件两种方法:a标签下载:js下载; <!-- 网页地址和图片地址同源的情况下这样是可以的,不同源则是直接打开这个地址 --> <!-- 方法一:同源情况下载 --&g ...

  7. 部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了

    部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了 安大虎 ​ momenta 中台开发工程师 6 人赞同了该文章 就目前的形势看,一家公司的运维体系不承载在 Do ...

  8. SSM使用AbstractRoutingDataSource后究竟如何解决跨库事务

    Setting: 绑定三个数据源(XA规范),将三个实例绑定到AbStractoutingDataSource的实例MultiDataSource(自定义的)对象中,mybatis  SqlSessi ...

  9. 吴裕雄--天生自然 R语言数据可视化绘图(3)

    par(ask=TRUE) opar <- par(no.readonly=TRUE) # record current settings # Listing 11.1 - A scatter ...

  10. 有多少人在面试时,被Java 如何线程间通讯,问哭了?

    正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点: thread.join(), object. ...