函数运算符
缓存
缓存问题是计算机科学以内存换速度的典型例子
memoise::memoise()
函数将括号内包裹的函数每次计算结果保存起来,从而在如果需要进行多次迭代运算的情况下,计算速度更快,因为不需要重复计算了
惰性
在R中不需要的参数是不会被计算的
f <- function(x, y) {
if(x < 0) y else x
}
在这个例子中,f(2)
是可以计算出结果不报错的,只有在x < 0时,此时需要参数y,才会报错。
预填充函数参数
局部函数应用,用pryr::partial()
实现,例:
f <- function(a) g(a, b = 1)
可以写成
f <- partial(g, b = 1)
改变输入类型
这不会带来什么性能上的提升
base::Vectorize()
将一个标量函数转换成一个向量函数plyr::splat()
将接受多个参数的函数转换成只接受一个参数列表的函数plyr::colwise()
将向量函数转换成处理数据框的函数
组合函数运算符
-
plyr::each()
,它接受一个向量化的函数列表并将它们组合成一个函数summaries <- plyr::each(mean, sd, median) summaries(1:10) #> mean sd median #> 5.50000 3.02765 5.50000
pryr::compose(f, g)
相当于f(g())
-
写成中缀函数之后就可以写成很有意思的表达式
`%o%` <- pryr::compose square <- function(x) x ^ 2 deviation <- function(x) x - mean(x) sd2 <- sqrt %o% mean %o% square %o% deviation sd2(1:10) #> [1] 2.872281