【问题标题】:Using R functions as a list使用 R 函数作为列表
【发布时间】:2017-03-21 12:06:53
【问题描述】:

我正在创建一个包含几个函数的 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

【问题讨论】:

  • @RonakShah,我关心的是如何评估它。我知道匿名函数,因此将问题标记在同一类别下。

标签: r anonymous-function


【解决方案1】:

当您将匿名函数分配给名称 g 时,可能会更清楚

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

g 有一个函数作为参数,并将使用从词法范围获得的参数x 调用此函数。所以对于x &lt;- 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

【讨论】:

  • 非常感谢哈拉德。
【解决方案2】:

lapply 的第二个参数是

function(f) f(x)

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

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

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))

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

【讨论】:

  • 如果 x 是 1:10,这个函数的结果是什么?
  • 运行一下就知道了?
  • 我得到的输出是:&gt; lapply(funs, function(f) f(x)) $sum [1] 55 $mean [1] 5.5 $median [1] 5.5 我明白了。我不明白的是第二个参数(一个函数)是如何被评估并传递给 lapply 的。
  • lapply 将列表中的输入 传递给 第二个参数。所以它基本上是说“让我们取列表中的第一项并将其用作第二个参数的输入,现在让我们取列表中的第二项并将其用作第二个参数的输入,......等等。
  • 答案是,无论f 做什么,它都会做。考虑一下。
最近更新 更多