8 函数运算符

8.1 缓存

缓存问题是计算机科学以内存换速度的典型例子

memoise::memoise()函数将括号内包裹的函数每次计算结果保存起来,从而在如果需要进行多次迭代运算的情况下,计算速度更快,因为不需要重复计算了

8.2 惰性

在R中不需要的参数是不会被计算的

f <- function(x, y) {
  if(x < 0) y else x
}

在这个例子中,f(2)是可以计算出结果不报错的,只有在x < 0时,此时需要参数y,才会报错。

8.3 预填充函数参数

局部函数应用,用pryr::partial()实现,例:

f <- function(a) g(a, b = 1)

可以写成

f <- partial(g, b = 1)

8.4 改变输入类型

这不会带来什么性能上的提升

  • base::Vectorize()将一个标量函数转换成一个向量函数
  • plyr::splat()将接受多个参数的函数转换成只接受一个参数列表的函数
  • plyr::colwise()将向量函数转换成处理数据框的函数

8.5 组合函数运算符

  • 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