【问题标题】:Apply each function in a list of functions on each each element in as second argument list?将函数列表中的每个函数应用于每个元素作为第二个参数列表?
【发布时间】:2014-07-07 22:40:30
【问题描述】:

我有两个列表。一个包含函数funcsList,每个接受一个参数,另一个包含参数argsList。 在第二个列表中的每个参数上调用第一个列表中每个函数的最佳(最有效)方法是什么 我认为我可以在 for 循环中执行此操作,但我认为可能有更好(更并行)的方式来执行此操作。

每个函数定义如下 funcN

因此,如果我在第一个列表中有 3 个函数,在第二个列表中有 2 个参数,则结果应该包含 6 个元素的列表或大小为 3*2 的矩阵

【问题讨论】:

    标签: r


    【解决方案1】:

    如果我理解正确并且您有两个类似的列表

    f<-list(sum, mean, median)
    v<-list(1:3, 10:20)
    

    你可以得到两者的所有组合

    outer(f,v, Vectorize(function(a,b) a(b)))
    
    #      [,1] [,2]
    # [1,]    6  165
    # [2,]    2   15
    # [3,]    2   15
    

    outer 负责将f 值与v 值匹配,Vectorize 确保每次只有一个函数作为a 传入。

    【讨论】:

    • 可爱!我以前从未见过 Vectorize 使用得这么好
    • 我从来没有见过Vectorize,我错过了。
    • sapply(f, mapply, v) - 因为从长远来看,Vectorize 实际上只是 mapply 的包装。
    • 这还具有可扩展的优势,可以将多个输入包含到以... 作为输入的函数中,即:f &lt;- list(sum, max, min); sapply(f, mapply, v, v, v, v);
    【解决方案2】:

    一些示例代码在这里会很有帮助,但这里有一个使用sapply的方法

    arglist <- list(one = rnorm(20),
                    two = runif(20))
    
    funclist <- list(mean,sd,var)
    
    sapply(funclist,function(f) sapply(arglist,f))
    
             [,1]      [,2]      [,3]
    one 0.1714100 0.8971787 0.8049297
    two 0.5062332 0.3339033 0.1114914
    

    【讨论】:

    • function(f) 在 sapply(funclist,function(f) sapply(arglist,f)) 行中做了什么
    • function(f) sapply(arglist,f) 定义了一个“匿名函数”,它获取funclist、f 的每个元素,并将其应用于arglist 的所有元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多