6 泛函
6.1 小知识点
注意区分:泛型函数(generic function)与泛函(functional)
泛函的定义:以函数作为输入并返回一个向量的函数
lapply()
,vapply()
是primitive function,它们是用C写的,尽量用它们,尽量不要使用sapply()
在需要自动运行的脚本里,因为它的输出结果是不可预测的,且遇到一些问题时不会报错,使用更严谨的vapply()
,或者使用lapply()
在输出时固定原始对象的数据结构不变即可,如:
并行
parallel::mclapply()
和parallel::mcMap()
可以实现并行计算,但只能在Unix系统中使用,windows下只能串行- parallel::parLapply()可以在windows使用,达到上面两个函数相同效果
三个矩阵泛函:
apply()
apply(X, MARGIN, FUN, ...)
的输出类型不确定,所以要留意sweep()
sweep(x, MARGIN, STATS, FUN = "-", check.margin = TRUE, ...)
举个例子描述它的用法:x <- matrix(1:20, nrow = 5) x1 <- sweep(x, 1, apply(x, 1, min), `-`) x2 <- sweep(x1, 1, apply(x1, 1, max), `/`)
即x按行依次减去x每一行对应的最小值得到x1 x1按行除以x1每一行对应的最大值得到x2
outer()
outer(X, Y, FUN = "*", ...)
默认计算X与Y的外积,但也可以指定其他的FUN,会对输入的所有可能组合进行计算
数组泛函
它可以应用于不规则的数组,数组中的每一行都可以有不同的列数,它的思想其实可以重写为:
tapply <- function(x, group, f, ..., simplify = TRUE) { pieces <- split(x, group) sapply(pieces, f, simplify = TRUE) }
其中
split()
按照group对x分组,返回一个list基础包中的泛函命名不一致,参数设置不一致,且没有覆盖全数据类型
输入类型、输出类型 列表 数据框 数组 列表 lapply
sapply
数据框 by
数组 apply
plyr
包提供一致性参数并涵盖所有数据类型输入类型、输出类型 列表 数据框 数组 列表 llply
ldply
laply
数据框 dlply
ddply
daply
数组 alply
adply
aaply
递归
通过递归调用函数
f()
,将向量x
计算成一个值,例:即就是
((1 + 2) + 3)
,参数right
可以使递归从向量x
的右段开始,init
初始值,accumulate
控制是否输出中间结果三个基础包中的判断泛函:
Filter()
只选择满足判断条件的元素Find()
返回满足判断条件的第一个元素(如果right = TRUE
则最后一个元素)Position()
返回满足判断条件的第一个元素的位置(如果right = TRUE
则最后一个元素)
三个数学泛函:
integrate()
计算定积分uniroot()
计算f() = 0
的点集optimize()
计算f()
最高点和最低点的位置