R语言笔记6:在R中写一些简单的函数

Your first R function

命令一个函数时,一般不写在交互式命令行里,而是写在一个空白的文本文件中,即把函数放在一个R包中,这里面包含着文档(documentation),是一个更加结构化的环境。

我们使用的软件是RStudio,左上角新建一个新的R脚本来写代码。

Example 1

举个例子,简单了解一下如何使用函数的语法、如何指定参数以及如何返回结果:

命令一个简单的函数,求x, y的和。

## 给函数赋值为add2,第一行小括号里写进变量,第二行大括号里写入运算
add2 <- function(x, y) {
  x + y
}
## 因为R函数会返回最后一个表达式的值,所以不用写返回

在控制台(console)运行脚本,赋值后即可得到结果:

> add2 <- function(x, y) {
+   x + y
+ }
> add2(7, 5)
[1] 12

Example 2

下一个例子稍微复杂一点:

我们要输入一个数字向量,然后返回这个向量的子集(返回其中大于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

Example 3

下面这个例子再复杂一点,我们要给函数一个参数,然后使用循环遍历这个函数的每一列:

比如,取一个矩阵,然后计算每列的平均值:

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

你可能感兴趣的:(R)