R Cheat Sheet (9): Functions
本节主要关注R中的函数、函数的参数,以及自定义二元运算符。
Contents [show]
1. R中的函数
R中函数的特征为函数名加上括号,如:
> Sys.Date()
[1] "2015-05-09"
> Sys.Date()
[1] "2015-05-09"
> Sys.Date() [1] "2015-05-09"
大多数R中的函数都有返回值,如上面Sys.Date() 函数没有输入参数,它根据系统环境返回当前时间;另一些函数会对输入的数据进行处理并返回结果,如使用mean() 求均值:
> mean(c(2, 4, 5))
[1] 3.666667
> mean(c(2, 4, 5))
[1] 3.666667
> mean(c(2, 4, 5)) [1] 3.666667
函数中最后一条R表达式的值会作为函数的返回值:
> boring_function <- function(x) {
+ x
+ }
> boring_function('My first function!')
[1] "My first function!"
> boring_function <- function(x) {
+ x
+ }
> boring_function('My first function!')
[1] "My first function!"
> boring_function <- function(x) { + x + } > boring_function('My first function!') [1] "My first function!"
也可以使用return 来进行返回,需要注意的是,return 后的返回值必须位于括号中:
> boring_function <- function(x) {
+ return(x)
+ }
> boring_function('My first function!')
[1] "My first function!"
> boring_function <- function(x) {
+ return(x)
+ }
> boring_function('My first function!')
[1] "My first function!"
> boring_function <- function(x) { + return(x) + } > boring_function('My first function!') [1] "My first function!"
直接键入函数名可以查看函数的源代码:
> boring_function
function(x) {
return(x)
}
> boring_function
function(x) {
return(x)
}
> boring_function function(x) { return(x) }
2. 函数的参数
2.1. 参数默认值
在编写函数时,可以在参数列表中为参数设置默认值,如果在调用函数时没有指定该参数,就会使用该默认值代替:
> remainder <- function(num, divisor = 2) {
+ num %% divisor
+ }
> remainder(5, 2)
[1] 1
> remainder(5)
[1] 1
> remainder(11, 5)
[1] 1
> remainder <- function(num, divisor = 2) {
+ num %% divisor
+ }
> remainder(5, 2)
[1] 1
> remainder(5)
[1] 1
> remainder(11, 5)
[1] 1
> remainder <- function(num, divisor = 2) { + num %% divisor + } > remainder(5, 2) [1] 1 > remainder(5) [1] 1 > remainder(11, 5) [1] 1
在调用函数时,可以显式地指明个别或者全部参数的值,可以按照任意顺序填写显式指明的参数:
> remainder(divisor = 11, num = 5)
[1] 5
> remainder(4, div = 2)
[1] 0
> remainder(divisor = 11, num = 5)
[1] 5
> remainder(4, div = 2)
[1] 0
> remainder(divisor = 11, num = 5) [1] 5 > remainder(4, div = 2) [1] 0
使用arg() 函数可以查看指定函数的参数:
> args(remainder)
function (num, divisor = 2)
NULL
> args(remainder)
function (num, divisor = 2)
NULL
> args(remainder) function (num, divisor = 2) NULL
2.2. 使用函数作为参数
上面的例子相当于将函数remainder() 作为参数传递给了函数arg() ,在R中可以把函数作为参数进行传递。
> evaluate <- function(func, dat){
+ func(dat)
+ }
> evaluate(sd, c(1.4, 3.6, 7.9, 8.8))
[1] 3.514138
> evaluate <- function(func, dat){
+ func(dat)
+ }
> evaluate(sd, c(1.4, 3.6, 7.9, 8.8))
[1] 3.514138
> evaluate <- function(func, dat){ + func(dat) + } > evaluate(sd, c(1.4, 3.6, 7.9, 8.8)) [1] 3.514138
也可以使用匿名函数作为参数:
> evaluate(function(x){x+1}, 6)
[1] 7
> evaluate(function(x){x+1}, 6)
[1] 7
> evaluate(function(x){x+1}, 6) [1] 7
2.3. 使用可变数量个参数
定义函数时,其所接受的参数的个数可以是不确定的,如paste() 函数,它的签名为:
paste (..., sep = " ", collapse = NULL)
paste (..., sep = " ", collapse = NULL)
paste (..., sep = " ", collapse = NULL)
其中的三个点… 表示其可以接受的参数个数是可变的:
> paste("Programming", "is", "fun!")
[1] "Programming is fun!"
> paste("Programming", "is", "fun!")
[1] "Programming is fun!"
> paste("Programming", "is", "fun!") [1] "Programming is fun!"
在编写自己的函数时,也可以使用… 来传递可变数量的参数:
> telegram <- function(...){
+ paste("START", ..., "STOP")
+ }
> telegram("Good", "morning")
[1] "START Good morning STOP"
> telegram <- function(...){
+ paste("START", ..., "STOP")
+ }
> telegram("Good", "morning")
[1] "START Good morning STOP"
> telegram <- function(...){ + paste("START", ..., "STOP") + } > telegram("Good", "morning") [1] "START Good morning STOP"
在函数中,可以对传递进来的… 进行解析,从中取出所需要的数据:
> mad_libs <- function(...){
+ args <- list(...)
+
+ place <- args[["place"]]
+ adjective <- args[["adjective"]]
+ noun <- args[["noun"]]
+
+ paste("News from",
+ place,
+ "today where",
+ adjective,
+ "students took to the streets in protest of the new",
+ noun,
+ "being installed on campus.")
+ }
> mad_libs(place="Mars", adjective="concerned", noun="oxygenerator")
[1] "News from Mars today where concerned students took to the streets in protest of the new oxygenerator being installed on campus."
> mad_libs <- function(...){
+ args <- list(...)
+
+ place <- args[["place"]]
+ adjective <- args[["adjective"]]
+ noun <- args[["noun"]]
+
+ paste("News from",
+ place,
+ "today where",
+ adjective,
+ "students took to the streets in protest of the new",
+ noun,
+ "being installed on campus.")
+ }
> mad_libs(place="Mars", adjective="concerned", noun="oxygenerator")
[1] "News from Mars today where concerned students took to the streets in protest of the new oxygenerator being installed on campus."
> mad_libs <- function(...){ + args <- list(...) + + place <- args[["place"]] + adjective <- args[["adjective"]] + noun <- args[["noun"]] + + paste("News from", + place, + "today where", + adjective, + "students took to the streets in protest of the new", + noun, + "being installed on campus.") + } > mad_libs(place="Mars", adjective="concerned", noun="oxygenerator") [1] "News from Mars today where concerned students took to the streets in protest of the new oxygenerator being installed on campus."
3. 自定义二元运算符
R也支持自定义二元运算符:
> "%p%" <- function(x, y){ # Remember to add arguments!
+ paste(x, y)
+ }
> "I" %p% "love" %p% "R!"
[1] "I love R!"
> "%p%" <- function(x, y){ # Remember to add arguments!
+ paste(x, y)
+ }
> "I" %p% "love" %p% "R!"
[1] "I love R!"
> "%p%" <- function(x, y){ # Remember to add arguments! + paste(x, y) + } > "I" %p% "love" %p% "R!" [1] "I love R!"