【问题标题】:Recursively Apply a Function with multiple arguments to a List in R递归地将具有多个参数的函数应用于R中的列表
【发布时间】:2021-07-17 12:47:35
【问题描述】:

我有一个嵌套列表,并希望将相同的函数应用于此列表的多个级别。这些函数非常复杂,需要多个参数。

Here 我发现了 rapply 是如何使用的,尽管它对我很有用。不幸的是,rapply 只接受单个参数的函数。

这是 R 中的一个小例子:

嵌套列表:

x=list(1,list(2,3),4,list(5,list(6,7)))

具有多个参数的函数:

doAddition <- function(listIterator,
                       list,
                       add){
  
  item <- list[listIterator]]
  out <- item + add
  return(out)
  
}

我会使用我列表第一级的这个功能,例如:

result <- lapply(seq_along(x), FUN = doAddition,
                 list = x, 
                 add = factor)

如何对我的所有列表级别使用相同的功能? 有没有接受多个参数的 rapply 替代方法?

【问题讨论】:

  • rapply 确实接受多个参数。您的功能似乎也比必要的复杂。为什么迭代索引而不是列表?也就是说,你为什么不简单地做lapply(x, `+`, factor)?这与您的代码相同,甚至不需要单独的函数。它也适用于rapplyrapply(x, `+`, how = 'list', ... = factor)
  • 根据文档 rapply 不接受多个参数:web.mit.edu/~r/current/arch/i386_linux26/lib/R/library/base/…。还是我错过了什么?如何在 rapply 中传递多个参数?这个例子中的函数是一个更复杂函数的简化
  • 您链接的文档显示“... 附加参数传递给f 的调用。”

标签: r list apply lapply


【解决方案1】:

你通常不会迭代索引,你会迭代 元素。一旦你这样做了,你的代码就可以直接翻译成rapply

rapply(x, `+`, ... = factor)

这将取消列出结果。如果要保留嵌套列表结构,请将how = 'list' 传递给rapply

请注意,这没有使用您的自定义 doAddition 函数,因为一旦您遍历元素,该函数就不再需要了。如果您的实际功能更复杂,同样适用:传递 元素,而不是索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2019-05-08
    • 2011-10-13
    • 2015-02-09
    相关资源
    最近更新 更多