使用 R 函数作为列表

Using R functions as a list

我正在创建一个包含几个函数的 R 列表:

funs <- list(
+     sum = sum,
+     mean = mean,
+     median = median
+     )

为了使用 lapply,我所指的 Hadley Wickham 的书使用:

lapply(funs, function(f) f(x))

我确实得到 lapply 函数的第一个参数是列表,但是 function(f) f(x) 为什么呢? 作为 lapply 的第二个参数,理想情况下应该是一个函数。我的 x 是:

x <- 1:10

lapply的第二个参数是

function(f) f(x)

其中一个函数。这是一个函数,其参数也是一个函数,f

为了阐明发生了什么,让我们从匿名函数中取出 "anonymous":

getFunc <- function(f) f(x)
lapply(funs, getFunc)

这与

完全一样
lapply(funs, function(f) f(x))

无需单独定义 getFunc

更进一步,我们取出x:

getFunc <- function(f, xx) f(xx)
lapply(funs, getFunc, xx=x)

这与

相同
lapply(funs, function(f) f(x))

但明确传递用于计算总和、平均值和中位数的数字,而不是自动从全局环境中获取它们。

当您将匿名函数分配给一个名称时,也许它会变得更清楚 g

g <- function(f) { 
  f(x)
}

g 有一个函数作为参数,并将使用从词法范围获得的参数 x 调用该函数。所以 x <- 1:10 你得到

g(sum) # = sum(x) = sum(1:10) 
[1] 55

同样

lapply(funs, g) # = list(g(sum), g(means), g(median)
                # = list(sum(x), means(x), median(x)
                # = list(sum(1:10), means(1:10), median(1:10)
$sum
[1] 55

$mean
[1] 5.5

$median
[1] 5.5