百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

R语言笔记5:控制结构

bigegpt 2024-08-16 14:14 2 浏览

R语言基础系列前情提要:

  • 1数据类型(向量、数组、矩阵、 列表和数据框)
  • 2读写数据所需的主要函数、与外部环境交互
  • 3数据筛选——提取对象的子集
  • 4:向量、矩阵的数学运算

Control Structures in R

R语言中控制结构可以用来控制程序的执行流程

常见控制结构的命令:

  • if and else: 测试逻辑条件
  • for: 用于执行固定次数的循环
  • while: 用于在某个条件成立时执行循环
  • repeat: 执行无限循环
  • break: 终止并跳出循环
  • next: 跳过循环中的当前迭代
  • return: 从函数中退出

If-else

如果条件成立,程序就做某件事

否则(另一种条件下)。程序做另一件事

if(<condition>) {
        ## do something
} 
else {
        ## do something else
}

Else不是必须的,如果只需要在某条件成立时执行某个任务,那么只要使用if语句就可以了

if(<condition>) {
        ## do something
} 
## Continue with rest of code

如果条件不止一个/不止两个的时候,可以添加一个/多个 elseif语句,但最后必须以 else结尾:

if(<condition1>) {
        ## do something
} else if(<condition2>)  {
        ## do something different
} else {
        ## do something different
}

取随机数字举例,y的取值随x的取值而定:

## Generate a uniform random number
x <- runif(1, 0, 10) 
x
if(x > 3) {
  y <- 10
} else {
  y <- 0
}

上面的代码也可以写成下面的形式,先给变量y赋值,这种写法的好处是更加明确的看出整个if结构是在给y赋值:

y <- if(x > 3) {
  10
} else { 
  0
}

For 循环(For loop)

for循环是R中最常见的循环运算符,基本思路是先要设定一个循环下标,通常命名为 i,循环下标通常会代表一个整数数列中的每一个数字,或列表中的每一个对象等等。

最简单的例子如下,运行后将依次输出1-10这十个整数:

for(i in 1:10) {
  print(i)
}

依次打印x中的每一个元素,运行后就会依次输出 "a", "b", "c", "d"四个字符对象:

  • 第一种方法是将循环向量和向量x的长度相对应:
x <- c("a", "b", "c", "d")
for (i in 1:4) {
  print(x[i])
}
  • 第二个方法,使用 seq_along()函数,即,输入一个向量,之后它就会创造一个与该向量等长的整数数列。因此上面的例子可以改写成,在我们不知道x的向量长度时,可以使用这种写法:
x <- c("a", "b", "c", "d")
for (i in seq_along(x)) {
  print(x[i])
}
  • 第三个方法,下标变量 letter,这个变量的本意就是一个下标,会从向量本身取值,它可以从任意向量中提取元素,因此可以写成:
x <- c("a", "b", "c", "d")
for (letters in x) {
  print(letters)
}

ps. 如果你的for循环表达式只有一行,那么可以省略掉大括号 {},直接写道 for的后面:

for (letters in x) print(letters)

嵌套for循环(Nested for loop)

把一个for循环放到另一个for循环的里面。

比如,有一个二维矩阵,你想先做一个行循环,再做一个列循环,这时就需要做一个嵌套for结构才能打印出所有矩阵中的元素。

我们设置 i为外层循环下标, j为内层循环下标:

> x <- matrix(1:6, 2, 3)
> x
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> for (i in seq_len(nrow(x))) {
+ for (j in seq_len(ncol(x))) {
+ print(x[i,j])  
+ }  
+ }
[1] 1
[1] 3
[1] 5
[1] 2
[1] 4
[1] 6

While 循环

While循环有一个逻辑表达式,循环是按照这个逻辑表达式的值来反复运行的。

举个栗子,

设定一个计数标量 count,初始值为0,当技术变量的值小于10(逻辑表达式)时,运行输出变量 count就在之前的基础上 +1,一旦 count的值达到10,循环停止

count <- 0
while(count < 10) {
         print(count)
  count <- count + 1
}

注意:你需要确保逻辑循环表达式的值是可以达到终止状态的,否则就会无穷无尽的循环下去。

使用逻辑运算符

再举个栗子,设计一个小型随机游走的程序:

首先赋值z=5,然后运行while循环,当z处于3~10中间时,进入循环,循环中抛硬币,硬币是随机数1和0.5,在嵌入if循环,z的值会根据硬币取值变化而变化,结束时间不定。

z <- 5
while (z >= 3 && z <= 10) {
  coin <- rbinom(1, 1, 0.5)
  if(coin == 1) {  ## random walk
    z <- z + 1
    } else {
    z <- z - 1
    }
}

repeat循环

这是一个无限循环结构,退出的方法是 break(在某个点强制退出)。

比如,当你想计算两个值何时达到无限接近,需要通过算法不断循环,直到逼近你设置的容差(允许范围)

x0 <- 1
tol <- 1e-8

repeat {
  x1 <- computeEstimate()

  if(abs(x1 - x0) < tol) {  ## Close enough?
    break
  } else {
    x0 <- x1
  } 
}

(这里的 computeEstimate()是需要事先设定的,如果这有这段这个代码的话跑不通)

注意,repeat循环风险很大,因为没硬性规定何时退出,有可能运行时间非常长,所以不建议直接使用

break函数

break用来完全退出循环

for(i in 1:100) {
      print(i)

      if(i > 20) {
              ## Stop loop after 20 iterations
              break  
      }     
}

next和return函数

nextreturn函数是一种控制结构。

next可用在任何一种循环中,跳过某一段循环。例如,在1-100的迭代循环中,想要跳过前20个,可以用这种方式:

for(i in 1:100) {
        if(i <= 20) {
                ## Skip the first 20 iterations
                next                 
        }
        ## Do something here
}

return主要用于退出函数,它会结束整个函数并且返回一个数值。

最后,Peng提到,这些控制结构最好用于编写程序的过程中,而在命令行和交互作用来说有其他的循环函数,如apply()等一系列函数,这些在这里暂且不提,以后会讲到。

参考资料:

  1. https://bookdown.org/rdpeng/rprogdatascience/R Programming for Data Science
  2. 《R语言实战》 Robert I. Kabacoff

相关推荐

了解Linux目录,那你就了解了一半的Linux系统

大到公司或者社群再小到个人要利用Linux来开发产品的人实在是多如牛毛,每个人都用自己的标准来配置文件或者设置目录,那么未来的Linux则就是一团乱麻,也对管理造成许多麻烦。后来,就有所谓的FHS(F...

Linux命令,这些操作要注意!(linux命令?)

刚玩Linux的人总觉得自己在演黑客电影,直到手滑输错命令把公司服务器删库,这才发现命令行根本不是随便乱用的,而是“生死簿”。今天直接上干货,告诉你哪些命令用好了封神!喜欢的一键三连,谢谢观众老爷!!...

Linux 命令速查手册:这 30 个高频指令,拯救 90% 的运维小白!

在Linux系统的世界里,命令行是强大的武器。对于运维小白而言,掌握一些高频使用的Linux命令,能极大提升工作效率,轻松应对各种系统管理任务。今天,就为大家奉上精心整理的30个Linu...

linux必学的60个命令(linux必学的20个命令)

以下是Linux必学的20个基础命令:1.cd:切换目录2.ls:列出文件和目录3.mkdir:创建目录4.rm:删除文件或目录5.cp:复制文件或目录6.mv:移动/重命名文件或目录7....

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...

15 个实用 Linux 命令(linux命令用法及举例)

Linux命令行是系统管理员、开发者和技术爱好者的强大工具。掌握实用命令不仅能提高效率,还能解锁Linux系统的无限潜力,本文将深入介绍15个实用Linux命令。ls-列出目录内容l...

Linux 常用命令集合(linux常用命令全集)

系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DM...

Linux的常用命令就是记不住,怎么办?

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux常用文件操作命令(linux常用文件操作命令有哪些)

ls命令在Linux维护工作中,经常使用ls这个命令,这是最基本的命令,来写几条常用的ls命令。先来查看一下使用的ls版本#ls--versionls(GNUcoreutils)8.4...

Linux 常用命令(linux常用命令)

日志排查类操作命令查看日志cat/var/log/messages、tail-fxxx.log搜索关键词grep"error"xxx.log多条件过滤`grep-E&#...

简单粗暴收藏版:Linux常用命令大汇总

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部下午好,我的网工朋友在Linux系统中,命令行界面(CLI)是管理员和开发人员最常用的工具之一。通过命令行,用户可...

「Linux」linux常用基本命令(linux常用基本命令和用法)

Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)1、显示日期的指令:d...

Linux的常用命令就是记不住,怎么办?于是推出了这套教程

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux的30个常用命令汇总,运维大神必掌握技能!

以下是Linux系统中最常用的30个命令,精简版覆盖日常操作核心需求,适合快速掌握:一、文件/目录操作1.`ls`-列出目录内容`ls-l`(详细信息)|`ls-a`(显示隐藏文件)...

Linux/Unix 系统中非常常用的命令

Linux/Unix系统中非常常用的命令,它们是进行文件操作、文本处理、权限管理等任务的基础。下面是对这些命令的简要说明:**文件操作类:*****`ls`(list):**列出目录内容,显...