【问题标题】:R Combine mapply and sapplyR结合mapply和sapply
【发布时间】:2012-08-30 00:45:33
【问题描述】:

我在 R 中有一个函数,它接受 3 个参数,比如 foo(x,y,z)

当我调用该函数时,我确实有一个x 的元素列表和一个y 的列表,但z 只有一个元素。如果Z 是一个列表,并且我想将foo 应用于每个元素,mapply(foo, x, y, z) 就可以了。

但是,由于z 不是列表,mapply(foo,x,y,z) 不起作用。

更具体地说,如果 x 和 y 分别是 3 个元素的列表,则以下内容确实有效:mapply(foo, x, y, list(z, z, z))

有没有一种方法可以将mapplysapply 组合在一起,而无需我先将z 组合成3 个元素的列表?我希望 z 被重复使用!

编辑 1: 我被问到一个例子:

mylist1 <- list(c(5,4), c(7,9), c(8,3))
mylist2<- list(c(2,3), c(6,7), c(10,11))
item3 <- matrix(data = 15, nrow = 3, ncol = 3)
foo <- function(x,y,z){
       return(x[1]+y[2]+z[2,2])
}

以下作品:

> mapply(foo, mylist1, mylist2, list(item3,item3, item3))
[1] 23 29 34

以下不起作用:

mapply(foo, mylist1, mylist2, item3)
Error in z[2, 2] : incorrect number of dimensions

【问题讨论】:

  • 我不认为我跟随。 ?mapply 的文档指出,参数是通过回收来扩展的。你能构建一个具体的例子来说明你的问题吗?

标签: r list sapply


【解决方案1】:

MoreArgs 参数用于mapply

mapply(foo, x = mylist1, y= mylist2, MoreArgs = list(z = item3))
## [1] 23 29 34

【讨论】:

  • 这与我建议的基本相同(但打字次数更多)。
  • 是的,但是我不确定它是否相同,您的解决方案是将list(item3) 评估为 MoreArgs 参数,还是作为... 的一部分?有关系吗?无论如何,我认为为可读性命名参数是一种好习惯。如果他们对同一件事进行评估,我很乐意将我的答案作为编辑添加到您的答案中
  • 哦,我不是在抱怨!我很确定如果您不命名list(item3),它会使用... 进行评估,但我不知道通过回收强制进行矢量化是否会产生性能成本。事实上,我不确定 R 如何在内部处理 MoreArgs 部分。
  • 查看这篇相关文章,进一步探讨这个问题:stackoverflow.com/questions/56443892/…
【解决方案2】:

您只需将最后一项放入列表中,R 就会很好地回收它:

mapply(foo, mylist1, mylist2, list(item3))

请注意,文档明确指出您传递的参数必须是:

要向量化的参数(严格为正长度的向量或列表,或全部为零长度)

而你试图传递一个矩阵。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    相关资源
    最近更新 更多