第五章 函数和正则
5.1函数
5.1.1内置函数
5.2.1创建和调用函数
定义函数的格式为:
函数名 <- function(参数列表){
函数体
return 返回值
}
注意:没有显式的“return”关键字声明应该从函数返回哪个值。在 R 中,函数中计算的最后一个值将自动返回。
hypotenuse <- function(x, y) {
sqrt(x ^ 2 + y ^ 2)
}
调用参数的格式:
函数名(参数列表)
参数可以是位置参数,还可以是关键字参数
> hypotenuse(3, 4)
[1] 5
> hypotenuse(y = 24, x = 7)
[1] 25
如果形参有默认参数,可以不带实参
hypotenuse <- function(x = 5, y = 12) {
sqrt(x ^ 2 + y ^ 2)
}
hypotenuse()
formals()、args()和formalArgs()函数都是用于取函数参数
> formals(hypotenuse)
$x
[1] 5
$y
[1] 12
> args(hypotenuse)
function (x = 5, y = 12)
NULL
> formalArgs(hypotenuse)
[1] "x" "y"
body()和deparse()函数用于返回函数体
> (body_of_hypotenuse <- body(hypotenuse))
{
sqrt(x^2 + y^2)
}
> deparse(body_of_hypotenuse)
[1] "{" " sqrt(x^2 + y^2)"
[3] "}"
为了避免输入那些实际上没有被函数用到的参数名,R 提供了一个特殊参数 ...,它包含了所有不能被位置或名称匹配的参数
>normalize<-function(x, m=mean(x, ...), s=sd(x, ...), ...) {
(x-m)/s
}
>normalize(c(1, 3, 6, 10, NA))
[1] NA NA NA NA NA
>normalize(c(1, 3, 6, 10, NA), na.rm=TRUE)
[1] -1.0215 -0.5108 0.2554 1.2769 NA
5.2.2 向其他函数传递和接收函数
函数可以像其他变量类型一样地使用,我们可将之作为其他函数的参数,并且从函数中返回。一个常见的,把其他函数当成参数的例子是 do.call。
> do.call(hypotenuse, list(x = 3, y = 4))
[1] 5
5.2.3变量的作用域
变量的作用域是指你在哪里可以看到此变量,当你在函数内部定义一个变量时,该函数中下面的语句将能访问到该变量。在 R中,子函数也能访问到这个变量。
5.2正则表达式
grep函数经常和正则表达式一起使用
正则通配符 | 描述 |
---|---|
“^” | 匹配一个字符串的开始 |
“$” | 匹配一个字符串的结尾 |
“.” | 匹配除了换行符以外的任一字符 |
“*” | 表示将其前的字符进行0个或多个的匹配 |
“?” | 匹配0或1个正好在它之前的那个字符 |
“+” | 匹配1或多个正好在它之前的那个字符 |
“|” | 表示逻辑的或 |
“[]” | 用来匹配多个字符,如果不使用任何分隔符号,则搜寻这个集合 |
“[-]” | 匹配一个范围,比如sub("[a-c]","",c("abcde","edcba"))匹配从a到c的字符 |