一、引言
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 something if (condition) { break } }
在 repeat 循环中,代码块会一直被执行,直到满足条件时退出循环。
例如:
i <- 1 repeat { print(i) i <- i + 1 if (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 <- 5 print(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 something return(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:
心动了没,来写一个属于自己的小方法和函数吧!