条件语句和循环语句

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

举个条件函数的例子

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. css position absolute相对于父元素的设置方式

    手机赚钱怎么赚,给大家推荐一个手机赚钱APP汇总平台:手指乐(http://www.szhile.com/),辛苦搬砖之余用闲余时间动动手指,就可以日赚数百元 大家知道css的position abs ...

  2. .NET Core 3 Web Api Cors fetch 一直 307 Temporary Redirect

    .NET Core 3 Web Api Cors fetch 一直 307 Temporary Redirect 继上一篇 .net core 3 web api jwt 一直 401 为添加JWT- ...

  3. DOTNET Core MVC (一)

    以控台的形式,运行.net core mvc 代码, Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => ...

  4. Oracle行结果合计的实现

    Oracle行结果合计的实现,主要应用于日期结果的集计,下面是具体的实现代码. With AA as ( select 'A' tNo ,  10 B from dual union select ' ...

  5. Lucene之分析器

    什么是分析器? 分析(Analysis)在Lucene中指的是将域(Field)文本转换为最基本的索引表示单元—项(Term)的过程. 分析器(Analyzer)对分析操作进行了封装,通过执行一系列操 ...

  6. JavaScript对象模型概念

    1.对象的概念 JavaScript只有函数对象才有类的概念,因此创建一个对象,必须使用函数对象.(ES6中可以直接声明一个class,实质上也是一个函数对象). 函数对象的内部有[[Construc ...

  7. echarts--可拖动的曲线图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Spark调优指南

    Spark相关问题 Spark比MR快的原因? 1) Spark的计算结果可以放入内存,支持基于内存的迭代,MR不支持. 2) Spark有DAG有向无环图,可以实现pipeline的计算模式. 3) ...

  9. 【剑指Offer】62、序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存.序列化可以基于先序. ...

  10. Spring MVC 定时任务注解说明

    一.注解说明. Spring 自带的定时任务执行@Scheduled注解,可以定时的.周期性的执行一些任务.查看@Scheduled的注解可以看到有以下三种: 1.1 String cron() de ...