【问题标题】:apply a list of functions to a single argument in R将函数列表应用于 R 中的单个参数
【发布时间】:2014-12-13 22:21:02
【问题描述】:

您好,我正在尝试将函数列表应用于 R 中的单个参数。例如,

flist <- list(F,G,H) #F,G,H are function objects

然后说我想要一个列表或向量 (F(x),G(x),H(x)) 其中 x 是一个标量数。 你知道我是怎么做到的吗?

【问题讨论】:

  • myscalar &lt;- 1 ; lapply(flist, function(x) x(myscalar)) 也许?
  • Map(function(f,x){ f(x) },flist,3) 是另一种选择(3 只是我选择的任意标量)。
  • 也看看here
  • @NickD1, Vectorize 只是mapply 的包装,所以我不会将它与outer 结合使用。您可以只使用 nrussells 解决方案,也可以使用我的(这可能是最快的)
  • 我自己认为 lapply 版本最干净。

标签: r


【解决方案1】:

实现这一目标的最有效方法(似乎)是使用单个 lapply(而不是 3 个不同的函数),例如

flist <- list(mean, unique, max) # Example functions list
MyScalar <- 1 # Some scalar
lapply(flist, function(f) f(MyScalar))
# [[1]]
# [1] 1
# 
# [[2]]
# [1] 1
# 
# [[3]]
# [1] 1

不过,如果所有函数都给出相同的大小/类别结果,您可以使用 vapply 进一步改进它

vapply(flist, function(x) x(MyScalar), FUN.VALUE = double(1))
## [1] 1 1 1

【讨论】:

    【解决方案2】:
    f <- function(x) x^1
    g <- function(x) x^2
    h <- function(x) x^3
    l <- list(f, g, h)
    
    sapply(l, do.call, list(2))
    ## [1] 2 4 8
    

    do.call 允许使用可变长度参数列表进行函数委托。 例如,c(1, 2, 3) 可以这样调用:do.call(c, list(1, 2, 3))(s|l)apply 只是遍历一个列表并将指定的函数应用于每个项目。所以通过l的第一次迭代将是:do.call(l[[1]], list(2)),相当于l[[1]](2),相当于f(2)

    【讨论】:

    • 你应该解释一下代码的作用以及函数的作用。
    • 嗯,前4行只是设置示例。
    • 假设我是从一个搜索引擎来到这里的,我不会通过阅读一段没有任何解释的代码来学到很多东西。
    • 明白,但是R 为每个函数提供了(非常)丰富的手册页,几乎每个函数都可以方便地命名。例如,?sapply?do.call。我能给出的任何解释都会对那些手册页造成不公正:-)
    • 谢谢,这是一个推荐的做法:简洁是可以接受的,但更完整的解释更好,请参阅文档:stackoverflow.com/help/how-to-answer
    猜你喜欢
    • 2016-08-17
    • 2022-12-10
    • 2014-03-17
    • 1970-01-01
    • 2013-12-14
    • 2021-07-17
    • 2014-08-05
    • 2018-12-19
    • 1970-01-01
    相关资源
    最近更新 更多