【问题标题】:Applying over a vector of functions在函数向量上应用
【发布时间】:2014-05-06 13:56:47
【问题描述】:

给定一个函数向量(实际上是一个列表):

 fs = c(sin, cos, tan)

和一个值向量:

 xs = c(.1, .3, .5)

对于每个向量元素是否有更好/更整洁/更快/更强的计算fs[[i]](xs[i])的方法:

 vapply(1:3, FUN.VALUE = 1 ,function(i){fs[[i]](xs[i])})
  [1] 0.09983342 0.95533649 0.54630249

或者我在某处缺少fapply 函数?这些函数将始终是单个标量值并返回单个标量值的函数。

【问题讨论】:

  • function(fun, ...) fun(...) 没有捷径一直困扰着我(do.call 很接近但不是。)R 的基本包需要一个恕我直言。
  • 缺少 mapzipcombine 函数(又名 Haskell)一直困扰着我。
  • Funcall <- function(f, ...) f(...) ...来自?Map

标签: r


【解决方案1】:

又好又简单:

mapply(function(fun, x) fun(x), fs, xs)

但我同意@flodel。我也在寻找function(fun, ...) fun(...) 的基本函数,但很惊讶似乎没有。另一方面,到目前为止,我从来不需要它。

【讨论】:

    【解决方案2】:

    这是一个替代方案,其与迄今为止的建议相比的主要优势在于它不需要定义匿名函数。

    mapply(do.call, fs, lapply(xs, list))
    # [1] 0.09983342 0.95533649 0.54630249
    

    【讨论】:

    • +1 我曾想过使用do.call,但这对我来说太模糊了。如果不进行调查,我不知道这是做什么的。
    • 是的,lapply() 很不幸。它是必需的,因为do.call() 要求它的第二个参数是一个列表。我自己的首选解决方案是写Funcall <- function(x,...) x(...); mapply(Funcall, fs, xs)。似乎是写这个的最清晰的方法,Funcall() 具有额外的优势,可以在需要时接受多个参数(如mapply(Funcall, fs, xs1, xs2, ...))。
    • 由于Vectorize 创建了一个基于mapply 的函数,你可以很容易地做到这一点:fapply <- Vectorize(do.call); fapply(fs, lapply(xs, list)),如果你想多次调用fapply,可以减少输入。
    猜你喜欢
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多