从零开始学习R语言编程:完全指南
一、引言
R语言是一种流行的数据分析语言,广泛应用于学术界、商业界和社会科学研究等领域。与其它数据分析软件相比,R语言的优点包括免费开源、高效可靠、具有强大的数据分析和可视化能力等。R语言的编程基础包括了各种控制结构和函数,可以方便地实现算法和数据操作。本篇文章将介绍R语言的基本编程结构,涵盖if-else语句、for循环、while循环和函数等,帮助读者快速上手学习R语言编程。
二、基本编程结构
基本数据结构已经在R语言基础中有详细的介绍,这里不在赘述!这部分主要讲其它的编程基础知识!
2.1 逻辑运算符
2.1.1 大于号运算符>
在R语言中,> 是大于号运算符,用于比较两个数值的大小。如果左侧数值比右侧数值大,则返回 TRUE,否则返回 FALSE。
例如:
a = 1# 左侧大于右侧
a > 0# 左侧小于右侧
a > 1
结果展示:
# 左侧大于右侧
[1] TRUE# 左侧小于右侧
[1] FALSE
2.1.2 小于号运算符<
在R语言中,< 是小于号运算符,用于比较两个数值的大小。如果左侧数值比右侧数值大,则返回 FALSE,否则返回 TRUE。
例如:
a = 1# 左侧大于右侧
a < 0# 左侧小于右侧
a < 2
结果展示:
# 左侧大于右侧
[1] FALSE# 左侧小于右侧
[1] TRUE
2.1.3 等于号运算符==
在R语言中,== 是小于号运算符,用于比较两个数值的大小。如果左侧数值是否等于右侧数值,则返回 TRUE,否则返回 FALSE。
例如:
a = 1# 左侧不等于右侧
a == 0# 左侧等于于右侧
a == 1
结果展示:
# 左侧不等于右侧
[1] FALSE# 左侧等于右侧
[1] TRUE
2.1.4 非等于号运算符!=
在R语言中,!= 是小于号运算符,用于比较两个数值的大小。如果左侧数值是否不等于右侧数值,则返回 TRUE,否则返回 FALSE。
例如:
a = 1# 左侧等于右侧
a != 1# 左侧非等于右侧
a != 0
结果展示:
# 左侧等于右侧
[1] FALSE# 左侧非等于右侧
[1] TRUE
2.1.5 逻辑And运算符&&
在R语言中,&& 是逻辑 AND 运算符,用于比较两个逻辑表达式,并返回一个逻辑值(TRUE 或 FALSE),其规则如下:
- 当 && 左右两侧的逻辑表达式都为 TRUE 时,返回 TRUE。
- 当只有其中一个逻辑表达式为 FALSE 时,返回 FALSE。
- 如果第一个逻辑表达式为 FALSE,不会执行第二个逻辑表达式。
例如:
a <- 1
b <- 2
# 两个都为True
a > 0 && b > 0# 其中一个为False
a < 0 && b > 0# 验证第三条,只有第一个为TRUE时才会执行后面一条
a > 0 && (a <- a + 1) > 1
cat("如果右边执行的话a应该为2,看看是不是吧?a=",a)# 验证第三条,只有第一个为FALSE时后面一条不会执行
a < 0 && (a <- a + 1) > 1
cat("如果右边执行的话a应该为3,看看是不是吧?a=",a)
结果展示:
# 两个都为True时
[1] TRUE# 其中一个为False
[1] FALSE# 验证第三条,只有第一个为TRUE时才会执行后面一条
如果右边执行的话a应该为2,看看是不是吧?a= 2# 验证第三条,只有第一个为FALSE时后面一条不会执行
[1] FALSE
如果右边执行的话a应该为3,看看是不是吧?a= 2
从执行结果来看,确实是如此的!
2.1.6 逻辑OR 运算符||
在R语言中,|| 是逻辑 OR 运算符,用于比较两个逻辑表达式,并返回一个逻辑值(TRUE 或 FALSE),其规则如下:
- 当 || 左右两侧的逻辑表达式都为 FALSE 时,返回 FALSE。
- 当只有其中一个逻辑表达式为 TRUE 时,返回 TRUE。
- 如果第一个逻辑表达式为 TRUE,不会执行第二个逻辑表达式。
例如:
a <- 1
b <- 2# 两个都为FALSE
a < 0 || b < 0# 其中一个为TRUE
a < 0 || b > 0# 验证第三条,只有第一个为FALSE时才会执行后面一条
a < 0 || (a <- a + 1) > 1
cat("如果右边执行的话a应该为2,看看是不是吧?a=",a)# 验证第三条,只有第一个为TRUE时后面一条不会执行
a > 0 || (a <- a + 1) > 1
cat("如果右边执行的话a应该为3,看看是不是吧?a=",a)
结果展示:
# 两个都为FALSE
[1] FALSE# 其中一个为TRUE
[1] TRUE# 验证第三条,只有第一个为FALSE时才会执行后面一条
[1] TRUE
如果右边执行的话a应该为2,看看是不是吧?a= 2# 验证第三条,只有第一个为FALSE时后面一条不会执行
[1] TRUE
如果右边执行的话a应该为3,看看是不是吧?a= 2
下面的不在一一校验,如果你们有兴趣的话,自己核对校验!
2.1.7 逻辑NOT 运算符!
在R语言中,! 是逻辑 NOT 运算符,用于对逻辑表达式进行取反操作。
- 如果逻辑表达式的值为 TRUE,则取反后的值为 FALSE;
- 如果逻辑表达式的值为 FALSE,则取反后的值为 TRUE。
例如:
a <- 1# TRUE取反
!(a == 1)
# FALSE取反
!(a == 2)
结果展示:
# TRUE取反
[1] FALSE# FALSE取反
[1] TRUE
2.2 条件语句
2.2.1 if
语句
if 语句是最基本的条件语句。其基本结构如下:
if (condition) {# do something
}
其中,condition 是一个逻辑表达式(也就是上面的2.1模块),只有当该条件为 TRUE 时,才会执行 if 语句块中的代码。
y <- 9
if (y > 10) {print("y大于10.")
} else if (y > 8) {print("y大于8 and y小于10.")
} else {print("y小于等于8.")
}
结果展示:
[1] "y大于8 and y小于10."
2.2.2 switch
语句
switch 语句用于在多个选项中选择一个执行代码块。其基本结构如下:
switch(expr, case1, case2, ..., default)
其中,expr 是一个表示要测试的表达式的值的标志,case1、case2、…… 表示各个选项,default 是可选的默认选项,当所有选项都不匹配时会执行 default 语句块中的代码。
week <- 3
day <- switch(week, "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
day
结果展示
[1] "Wednesday"
2.3 循环语句
2.3.1 for
循环
for 循环是最常见的循环语句,其基本结构如下:
for (variable in sequence) {# do something
}
其中,variable 是循环变量,在每次循环时都会从 sequence 中取出一个值并赋值给 variable,最终执行 if 语句块中的代码。
例如:
for (i in 1:3) {print(i)
}
结果展示:
[1] 1
[1] 2
[1] 3
2.3.2 while
循环
while 循环会在条件表达式为 TRUE 时重复执行代码块,其基本结构如下:
while (condition) {# do something
}
其中,condition 是一个逻辑表达式,只有当该条件为 TRUE 时,代码块才会被执行。
例如:
i <- 1
while (i <= 5) {print(i)i <- i + 1
}
结果展示:
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
2.3.3 repeat
循环
repeat 循环会无限重复执行代码块,直到遇到 break 语句才会退出循环,其基本结构如下:
repeat {# do somethingif (condition) {break}
}
在 repeat 循环中,代码块会一直被执行,直到满足条件时退出循环。
例如:
i <- 1
repeat {print(i)i <- i + 1if (i > 5) {break}
}
结果展示:
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
三、变量和作用域
在R语言中,可以通过赋值运算符 <-
或 =
来将一个数值赋给一个变量。例如:
x <- 5
y = 10
在上述代码中,x 和 y 分别被赋值为 5 和 10。
R中变量的作用域分为全局作用域和局部作用域两种。全局作用域中定义的变量可以在程序的任何位置被访问,局部作用域中定义的变量只能在当前的代码块或函数中被访问。
my_function <- function() {x <- 5print(x)
}my_function() # output: 5
print(x) # error: object 'x' not found
在上述代码中,变量 x 在函数 my_function 中被定义,并使用 print 函数打印输出。在函数外部使用 print 函数时,由于变量 x 的作用域限制,会提示找不到变量 x。
四、函数的编写和调用
函数是一种将一组计算封装在一起的结构,可以被调用多次,提高代码的复用性和可维护性。在R语言中,可以使用 function 关键字定义一个函数。函数的基本结构如下:
my_function <- function(arg1, arg2, ...) {# do somethingreturn(result)
}
其中,arg1、arg2、… 是函数的参数列表,用于接收函数调用时传入的数据;do something 是函数的计算过程,result 是函数的返回值。
例如:
sum_function <- function(x, y) {return(x + y)
}z <- sum_function(3, 4)
print(z) # output: 7
在上述代码中,我们定义了一个名为 sum_function 的函数,用于计算两个数值的和。在函数调用时,传入参数 3 和 4,函数返回结果 7,并使用 print 函数打印输出。
五、调试和错误处理
在编程中,调试和错误处理是常见的任务,特别是当程序逻辑较为复杂或数据量较大时,可能出现各种各样的错误。在R语言中,可以使用以下调试和错误处理工具和技术:
print
函数
print 函数是最常见的调试工具之一,可以用于在程序中打印输出变量值、调试信息和执行路径等。在调试过程中,可以在程序中插入 print 函数,输出关键信息,帮助定位错误。
例如:
x <- 5
y <- 10
print(x + y) # output: 15
在上述代码中,我们使用 print 函数输出变量 x 和 y 的和,帮助检查程序的计算过程是否正确。
browser
函数
browser 函数是一种交互式调试工具,可以在程序执行到指定位置时挂起程序,并进入交互模式,允许用户逐步检查变量值和程序执行路径等。在调试过程中,可以在程序中插入 browser 函数,帮助调试复杂的逻辑错误。
例如:
x <- 5
y <- 10
if (x > y) {print("x is greater than y.")
} else {browser()print("x is less than or equal to y.")
}
在上述代码中,我们使用 if 语句判断 x 和 y 的大小关系,如果 x 大于 y,则输出 “x is greater than y.”,否则进入 browser 函数所在的位置(相当于设置了以单个断点),待用户输入下一步操作。
当程序执行到 browser 函数所在的位置时,程序会进入交互模式,允许用户逐步检查变量值和程序执行路径等。例如,可以使用 ls 函数查看当前环境中的变量:
Browse[1]> ls()
[1] "x" "y"
tryCatch
函数
tryCatch 函数是一种错误处理机制,允许用户捕获和处理程序中出现的错误,并进行相应的响应。在使用 tryCatch 函数时,可以指定需要捕获的错误类型和处理方式,例如输出错误信息、重新执行程序等。
例如:
result <- tryCatch({x <- "abc"y <- as.numeric(x)y
}, error = function(e) {print(paste("Error:", e$message))NA
})print(result)
在上述代码中,我们尝试将字符型变量 x 转换为数值型变量 y,由于变量 x 的类型不匹配,会引发错误。在 tryCatch 函数中,我们捕获 “error” 类型的错误,使用 print 函数输出错误信息,并将结果赋值为缺失值 NA。
从应用的角度出发,在开发过程中可以使用上述调试和错误处理工具和技巧在编写代码时尽可能避免程序bug,并快速的定位和修复程序中的 bug 或错误,提升快速故障定位和问题诊断处理的效率。
六、应用编程技术案例
我们实用R语言实现一个简单的计算机,代码、执行和使用方法如下:
- 计算器代码
calculator <- function() {repeat {# 输入两个操作数和运算符a <- readline(prompt = "Enter first number: ")if (a == "") {break}b <- readline(prompt = "Enter second number: ")if (b == "") {break}op <- readline(prompt = "Enter operator (+, -, *, /): ")if (op == "") {break}# 将输入的字符型变量转换为数值型变量a <- as.numeric(a)b <- as.numeric(b)# 判断运算符并进行操作if (op == "+") {result <- a + b} else if (op == "-") {result <- a - b} else if (op == "*") {result <- a * b} else if (op == "/") {result <- a / b} else {result <- "Invalid operator"}# 输出操作结果cat("\nThe result is: ", result, "\n")}
}
- 启动计算器
calculator()
- 执行结果展示
> calculator()
Enter first number: 1
Enter second number: 2
Enter operator (+, -, *, /): +The result is: 3
Enter first number: 9
Enter second number: 6
Enter operator (+, -, *, /): /The result is: 1.5
Enter first number:
心动了没,来写一个属于自己的小方法和函数吧!
相关文章:
从零开始学习R语言编程:完全指南
一、引言 R语言是一种流行的数据分析语言,广泛应用于学术界、商业界和社会科学研究等领域。与其它数据分析软件相比,R语言的优点包括免费开源、高效可靠、具有强大的数据分析和可视化能力等。R语言的编程基础包括了各种控制结构和函数,可以方…...
PulsarMQ系列入门篇
文章目录 介绍:部署安装讲解:安装单机版本测试(Linux下): 介绍: PulsarMQ 现托管于apache Apache 软件基金会顶级项目,2016年由雅虎公司开源的分布式多租户消息中间件 ,是下一代云原生分布式消息…...
编程的实践理论 第九章 交互
第九章 交互 根据状态的初始值和终止值,我们已经描述了计算。一个状态变量的声明如下: var x: T S ∃x, x′: T S 它说的是一个状态变量有两个数学变量,一个是初始值,一个是终止值。在这个 声明的作用域内,x和x…...
BSN全球技术创新发展峰会在武汉举办,“延安链”正式发布
原标题:《第二届BSN全球技术创新发展峰会在武汉成功举行》 6月9日,由湖北省人民政府指导,湖北省发展改革委、国家信息中心联合主办,中国移动、中国电信、中国联通、武汉市江汉区人民政府、区块链服务网络(BSN…...
8.4 IP地址与端口号
目录 IP地址 IP地址及编址方式 IP 地址及其表示方法 点分十进制记法举例 IP 地址采用 2 级结构 分类的 IP 地址 分类的 IP 地址 多归属主机 各类 IP 地址的指派范围 编辑 一般不使用的特殊的 IP 地址 编辑 分类的 IP 地址的优点和缺点 划分子网 无分类编址 CIDR 无…...
day56_springmvc
今日内容 零、 复习昨日 零、 复习昨日 一、JSON处理【重点】 springmvc支持json数据交互,但是自己本身没有对应jar,使用的是第三方Jackson,只需要导入对应依赖,springmvc即可使用 如果需要换用到FastJson 导入依赖配置文件中指定json转换的类型为FastJson本次课程没有替换,用的…...
SQL Server Management Studio (SSMS)下载,安装以及连接数据库配置
目录 (一)前言 (二)下载与安装 1. 下载 (1)下载地址 (2)SSMS对操作系统的要求 2. 安装 (1)存放下载好的安装包 (2) 双击进入安…...
go 错误 异常
自定义错误 Go语言中 错误使用内建的 error 类型表示, error类型是一个接口类型:定义如下: error 有一个 Error() 的方法‘所有实现该接口的类型 都可以当做一个错误的类型;Error()方法输入具体错误描述,在打印错误时…...
智慧加油站卸油作业行为分析算法 opencv
智慧加油站卸油作业行为分析系统通过opencvpython网络模型技术,智慧加油站卸油作业行为分析算法实现对卸油作业过程的实时监测。当现场出现卸油作业时人员离岗,打电话人员抽烟等违规行为,灭火器未正确摆放,明火和烟雾等异常状态&a…...
LiangGaRy-学习笔记-Day22
1、shell工具-tput 这个是tput bash工具 具体的操作如下: tput clear:清屏tput cup Y X 第Y行,第X列的位置 tput bold:字体加粗tput sgr0 : 重置命令tput setaf n n:代表数字0-7 0黑色1红色2绿色3黄色4蓝…...
数据库横表和竖表有什么区别
横表和竖表是描述数据库表结构的两种形式,它们之间的主要区别在于数据的组织方式和用途。 横表(宽表): 横表是一种常见的表结构,其特点是每一行数据包含所有相关属性,字段通常作为列出现。横表中的每行代表…...
哈希表--day1--基本理论介绍
文章目录 哈希表哈希函数哈希碰撞拉链法线性探测法 常见的三种哈希函数数组setmap 总结 哈希表 Hash table是根据关键码的值来直接进行访问的数据结构。 其实直白来讲其实数组就是一张哈希表,不过其索引是十分简单的,我们通过0来访问num[0],…...
基于OpenMV的疲劳驾驶检测系统的设计
一、前言 借助平台将毕业设计记录下来,方便以后查看以及与各位大佬朋友们交流学习。如有问题可以私信哦。 本文主要从两个方面介绍毕业设计:硬件,软件(算法)。以及对最后的实验结果进行分析。感兴趣的朋友们可以评论区…...
chatgpt赋能python:使用Python来寻找两个列表不同元素的方法
使用Python来寻找两个列表不同元素的方法 在编写Python程序时,我们经常需要比较两个列表的元素,找出它们之间的不同之处。在搜索引擎优化(SEO)方面,这种比较对于找出两个网站内容的差异也非常有用。在这篇文章中&…...
简单学生管理系统
简单学生管理系统(Java)_封奚泽优的博客-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/130667107?spm1001.2014.3001.5501 转载请注明出处,尊重作者劳动成果。 目录 前期准备: 数据库的连接: 用户账号类:…...
图像金字塔
图像金字塔是由一幅图像的多个不同分辨率的子图构成的图像集合。是通过一个图像不断的降低采样率产生的,最小的图像可能仅仅有一个像素点。下图是一个图像金子塔的示例。从图中可以看到,图像金字塔是一系列以金字塔形状排列的、自底向上分辨率逐渐降低…...
Springboot整合Camunda工作流引擎实现审批流程实例
环境:Spingboot2.6.14 camunda-spring-boot-starter7.18.0 环境配置 依赖配置 <camunda.version>7.18.0</camunda.version> <dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boo…...
PHP设计模式21-工厂模式的讲解及应用
文章目录 前言基础知识简单工厂模式工厂方法模式抽象工厂模式 详解工厂模式普通的实现更加优雅的实现 总结 前言 本文已收录于PHP全栈系列专栏:PHP快速入门与实战 学会好设计模式,能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的非常…...
【玩转Docker小鲸鱼叭】理解Docker的核心概念
Docker核心概念 Docker有三大核心概念:镜像(Image)、容器(Container)、仓库(Repository) 1、镜像(Image) Docker镜像 是我们创建和运行Docker容器的基础,它…...
Eureka 心跳和服务续约源码探秘——图解、源码级解析
🍊 Java学习:社区快速通道 🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想 🍊 绝对不一样的职场干货:大厂最佳实践经验指南 📆 最近更新:2023年5月25日 🍊 点赞 👍 收藏 ⭐留言 📝 都是我最大的动力! 文章目录 分布式系统的心跳机制心跳机制的实…...
代码随想录二刷 530 二叉搜索树的最小绝对差 98. 验证二叉搜索树 700. 二叉搜索树中的搜索
530 二叉搜索树的最小绝对差 代码如下 func getMinimumDifference(root *TreeNode) int { var pre *TreeNode res : math.MaxInt var traverse func(root * TreeNode) traverse func(root * TreeNode) { if root nil { return } traverse(root.Left) …...
Docker安装——CentOS7.6(详细版)
ps:docker官网 在 CentOS 上安装 Docker 引擎 |官方文档 () 一、确定版本(必须是7以上版本) cat /etc/redhat-release 二、卸载旧版本(或者之前装过,没有安装过就不用管了) (root用…...
论信息系统项目的整体管理(范文)
论信息系统项目的整体管理(范文) 【摘要】 2016年10月,XX省卫生健康委启动了XX省分级转诊服务平台建设项目,我在项目中担任项目经理,负责项目的全面管理工作。该平台作为全省上下级医院转诊的信息化通道,…...
【音视频处理】音频编码AAC详解,低码率提高音质?
大家好,欢迎来到停止重构的频道。 本期我们介绍音频编码格式AAC。 AAC是音频最常用的编码格式之一,几乎所有的播放器都支持这个编码格式。 其他音频编码格式都是类似的,只是某些细节存在差别,如压缩算法、某些音频参数存在限制…...
逆函数学习
逆函数 给定关系 R ⊆ X Y R\subseteq X\times Y R⊆XY,颠倒 R R R的所有有序偶可以得到 R R R的逆关系 R ~ ⊆ Y X \tilde{R}\subseteq Y\times X R~⊆YX 但是对于函数 f : X → Y f:X\to Y f:X→Y而言,其逆关系 f ~ \tilde{f} f~可能不是 Y Y Y到…...
代码审计——SSRF详解
为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 服务端请求伪造攻击(SSRF)也成为跨站点端口攻击,是由于一些应用在向第三方主机请求资源时提…...
搭建Scala开发环境
一、Windows上安装Scala 1、到Scala官网下载Scala Scala2.13.10下载网址:https://www.scala-lang.org/download/2.13.10.html 单击【scala-2.13.10.msi】超链接,将scala安装程序下载到本地 2、安装Scala 双击安装程序图标,进入安装向导&…...
BLIP和BLIP2
文章主要是对BLIP2 (使用冻结图像编码器和大型语言模型的Bootstrapping语言图像预训练)论文的阅读笔记,也对BLIP(用于统一视觉语言理解和生成的Bootstrapping语言图像预训练)算法进行了简单的介绍。 文章:…...
微信小程序开发实战 ⑨(TabBar)
作者 : SYFStrive 博客首页 : HomePage 📜: 微信小程序 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 Ǵ…...
微前端探秘:初始微前端、现有方案和未来趋势
初识微前端 微前端是什么 概念: 微前端是指存在于浏览器中的微服务。 微前端是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将单页面前端应用由单一的单体应用转变为把多个小型前端应用聚合为一体的应用。这就意味着前端应用…...
临沂天元建设集团/宁波seo营销
创建文档时,将图片放入单元格,随着单元格宽与高的改变,图片大小也跟着变化 导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.4</version>&…...
好网站推荐一下/品牌推广内容
微软等数据结构算法面试100题系列之网友精彩回复 [一] ------------------------------ 作者:July 飞雪 一直不断有网友来信,想要微软等100题的答案,可由于整理这100题的答案,分量太大。 所以,后60题的答案,一直迟迟…...
怎么看网站是什么语言做的后台/长沙关键词优化公司电话
作者:Mazin https://my.oschina.net/u/3441184/blog/893628 这样的情景可能不常见,但是还是会有的,一旦遇到,如果业务比较复杂,就会很麻烦,但是还是有解决的方案的,比如将一个service方法拆成两…...
用vs2010做网站登入/百度搜索优化软件
张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护。Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的研究;曾为 ngx_lua 贡献源码,在 Ngin…...
专门做化妆品的网站/优化工作流程
2.1 问题 如图配置IPv6地址和OSPFv3区域 查看OSPFv3邻居和数据库LSA 确保 R1 和 R3 可以互相访问2.2 方案 搭建实验环境,如图-2所示。 图-2 2.3 步骤 实现此案例需要按照如下步骤进行。 1)配置R1 地址,并启用 OSPFv3 <Huawei>und…...
江苏专业网站建设公司电话/跨境电商怎么做
目的: 代码的重构!我上一次写的随笔“C#学习——序列化和反序列化”对接口的理解似乎有误,接口基本上没进行什么设计,之后虽然也重新设计了一下, 但是写了两个接口IDeserialize和ISerialize每个接口里面只有一方法&…...