本节书摘来自华章社区《R语言机器学习:实用案例分析》一书中的第1章,第1.3节使用函数,作者[印度] 拉格哈夫·巴利(Raghav Bali)迪潘简·撒卡尔(Dipanjan Sarkar),更多章节内容可以访问云栖社区“华章社区”公众号查看
1.3 使用函数
接下来,我们将介绍函数。函数是一种有助于简单地结构化和模块化代码的技术或者方法,它是一组完成特定任务的具体代码行,当你需要执行该任务时可以直接执行该函数,而不需要再次编写它们。在R中,函数仅仅作为另一种数据类型,在需要时可以对函数进行赋值和操作,也可以将其作为参数传递给其他函数。下面将介绍这些内容。
1.3.1 内置函数
R由基础添加包中的许多函数构成,当你安装更多的添加包时,你也将以函数的形式获取更多的功能。在下面的例子中我们将看到一些新的内置函数:
> sqrt(5)
[1] 2.236068
> sqrt(c(1,2,3,4,5,6,7,8,9,10))
[1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751
[8] 2.828427 3.000000 3.162278
> # aggregating functions
> mean(c(1,2,3,4,5,6,7,8,9,10))
[1] 5.5
> median(c(1,2,3,4,5,6,7,8,9,10))
[1] 5.5
你可以从以上例子中看到,像mean、medium和sqrt这样的函数是内置函数。当你启动R时,无论何时都可以直接使用它们,而不必加载任何添加包或显式地定义这些函数。
1.3.2 用户自定义函数
你可以基于你想对数据执行的不同运算和计算来定义自己的函数,并让R按照你需要它们工作的方式来执行这些函数,这是R函数真正强大之处。如下面的例子所示:
square <- function(data){
return (data^2)
}
> square(5)
[1] 25
> square(c(1,2,3,4,5))
[1] 1 4 9 16 25
point <- function(xval, yval){
return (c(x=xval,y=yval))
}
> p1 <- point(5,6)
> p2 <- point(2,3)
>
> p1
x y
> square(c(1,2,3,4,5))
[1] 1 4 9 16 25
point <- function(xval, yval){
return (c(x=xval,y=yval))
}
> p1 <- point(5,6)
> p2 <- point(2,3)
>
> p1
x y
5 6
> p2
x y
2 3
正如我们在前面的代码片段中所看到的,我们可以定义像square一样的函数,使用相同的代码来计算一个数值的平方,甚至一个数值向量的平方。像point这样的函数可以用来表示特定实体,这些实体表示二维坐标空间中的点。现在我们将看到如何一起使用以上这些函数。
1.3.3 以参数形式传递函数
当你定义任何函数时,如果你需要在你的函数中使用其他函数执行一些复杂的计算,你也可以将这些函数作为参数进行传递。下面的例子使用前面定义的square函数来计算两点间的欧几里得距离,它把square函数作为参数进行传递:
> # defining the function
euclidean.distance <- function(point1, point2, square.func){
distance <- sqrt(
as.integer(
square.func(point1['x'] - point2['x'])
) +
as.integer(
square.func(point1['y'] - point2['y'])
)
)
return (c(distance=distance))
}
> # executing the function, passing square as argument
> euclidean.distance(point1 = p1, point2 = p2, square.func = square)
distance
4.242641
> euclidean.distance(point1 = p2, point2 = p1, square.func = square)
distance
4.242641
> euclidean.distance(point1 = point(10, 3), point2 = point(-4, 8),
square.func = square)
distance
14.86607
因此,你可以看到,使用函数你可以定义一次一个特定函数,你需要执行多少次就执行多少次。