G. B.

个人博客

且将新火试新茶,诗酒趁年华


函数运算符

函数运算符

缓存

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

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