第五章 函数和正则

昵称已经被使用 / 2023-08-13 / 原文

第五章 函数和正则

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的字符