命令一个函数时,一般不写在交互式命令行里,而是写在一个空白的文本文件中,即把函数放在一个R包中,这里面包含着文档(documentation),是一个更加结构化的环境。
我们使用的软件是RStudio,左上角新建一个新的R脚本来写代码。
举个例子,简单了解一下如何使用函数的语法、如何指定参数以及如何返回结果:
命令一个简单的函数,求x, y的和。
## 给函数赋值为add2,第一行小括号里写进变量,第二行大括号里写入运算
add2 <- function(x, y) {
x + y
}
## 因为R函数会返回最后一个表达式的值,所以不用写返回
在控制台(console)运行脚本,赋值后即可得到结果:
> add2 <- function(x, y) {
+ x + y
+ }
> add2(7, 5)
[1] 12
下一个例子稍微复杂一点:
我们要输入一个数字向量,然后返回这个向量的子集(返回其中大于10的数字)
above10 <- function(x){ ## 命名变量
use <- x > 10 ## 逻辑语句,来判断变量x是否大于10
x[use] ## 取子集
}
运行:
> above10 <- function(x){
+ use <- x > 10
+ x[use]
+ }
> x <- 1:16
> above10(x)
[1] 11 12 13 14 15 16
> above10(1:9)
integer(0)
如果我们不设置10,而是改成任意数字n,以上命令可改写为:
above <- function(x, n){
use <- x > n
x[use]
}
运行:
> above <- function(x, n){
+ use <- x > n
+ x[use]
+ }
> x <- 1:16
> above(x, 12)
[1] 13 14 15 16
设置“缺省值”(可以理解为默认值),即如果在函数运行过程中不指定n的值时,系统自动筛选的标准:
above <- function(x, n = 10){ ## 设置缺省值为10
use <- x > n
x[use]
}
这时当你运行函数时:
> above <- function(x, n = 10){
+ use <- x > n
+ x[use]
+ }
> above(x) ## 自动筛选数字向量中大于10的数字
[1] 11 12 13 14 15 16
下面这个例子再复杂一点,我们要给函数一个参数,然后使用循环遍历这个函数的每一列:
比如,取一个矩阵,然后计算每列的平均值:
columnmean <- function(x){ ## 给函数命名,设置参数x,用于储存矩阵
nc <- ncol(x) ## 计算矩阵中有多少列
means <- numeric(nc) ## 设置数值向量储存列数,长度等于列数,它是一个空向量,每个元素的初始值为0,数值在循环中填满。
for (i in 1:nc){ ## 设置循环,循环参数在整数向量1到列数之间
means[i] <- mean(x[,i]) ## 把每一列的平均值赋予means[i],x[,i]是矩阵取子集,即求每列的平均值
}
means ## 返回means,平均值向量
}
运行这个程序,计算airquality
数据集每列的平均值:
ps.airquality
数据集有6列,前六行长这样:
> head(airquality)
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
运行脚本可以看到函数columnmean(airquality)
返回了6个平均值:
> columnmean <- function(x){
+ nc <- ncol(x)
+ means <- numeric(nc)
+ for (i in 1:nc){
+ means[i] <- mean(x[,i])
+ }
+ means
+ }
> columnmean(airquality)
[1] NA NA 9.957516 77.882353 6.993464 15.803922
可以看到,如果某列有缺失值NA的话,计算得出的数值就直接是NA。
所以我们可以添加一个逻辑参数,设置移除缺失值:
columnmean <- function(x, removeNA = TRUE){ ## 添加参数,并设置缺省值为TRUE
nc <- ncol(x)
means <- numeric(nc)
for (i in 1:nc){
means[i] <- mean(x[,i], na.rm = removeNA) ## 在mean()函数中添加参数
}
means
}
再次运行程序,可以看到计算结果是默认移除NA后求得的平均值:
> columnmean(airquality)
[1] 42.129310 185.931507 9.957516 77.882353 6.993464 15.803922
参考资料:
1. 视频课程
R Programming by Johns Hopkins University:https://www.coursera.org/learn/r-programming/home/welcome
2. 讲义
Programming for Data Science :https://bookdown.org/rdpeng/rprogdatascience/R