在列表中映射函数,但具有不同的函数输入

时间:2017-12-17 17:31:43

标签: r list for-loop

我正在寻找一种在列表上映射函数的方法,但是能够为每次迭代赋予函数不同的输入。

一个简单的例子如下:

example_func <- function(a, b, c) {
  z = a + b + c
  return(z)
}

ex_list <- list(5, 14, 32)

在列表中的第一个元素上执行将如下所示:

example_func(ex_list[[1]], 45, 43)

我知道我也可以:

lapply(ex_list, function(x) example_func(x, 45, 43)

但是该示例将对lapply中的每个迭代使用45和43。我怎么能给它,例如,这三组参数迭代列表中的三个元素?

c(x, 45, 43)
c(x, 3, 33)
c(x, 23, 22)

或者另一个类似的例子是write.csv(),它接受对象,然后写入要写入的文件的名称。

set.seed(123)
df <- data.frame(x = sample(1:10, 1000, replace = TRUE))
df_list <- split(df, df$x)
lapply(df_list, function(x) write.csv(x, arg1))...

我怎么能遍历这个列表并给出指定的名称来提供它?

之前我做过类似的事情,但是它会循环遍历seq_along列表,然后在名称向量中找到该索引。有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

只需将其他值放在另外两个列表中,例如l2l3。然后使用Map,这就是它的意思。

ex_list <- list(5, 14, 32)
l2 <- list(45, 3, 23)
l3 <- list(43, 33, 22)

Map(example_func, ex_list, l2, l3)
#[[1]]
#[1] 93
#
#[[2]]
#[1] 50
#
#[[3]]
#[1] 77

这可以对任意数量的函数参数进行,每个函数参数都在自己的列表中设置。

答案 1 :(得分:4)

使用<%= event.awayTeamName %> ,这是tidyverse的工作。使用purrr函数,您可以遍历多个列表。

pmap

example_func <- function(a, b, c) { z = a + b + c return(z) } ex_list <- list(5, 14, 32) ex_args1 <- list(45, 3, 23) ex_args2 <- list(43, 33, 22) library(purrr) list(ex_list, ex_args1, ex_args2) %>% pmap(example_func) #> [[1]] #> [1] 93 #> #> [[2]] #> [1] 50 #> #> [[3]] #> [1] 77 example_func(ex_list[[1]], ex_args1[[1]], ex_args2[[1]]) #> [1] 93 example_func(ex_list[[2]], ex_args1[[2]], ex_args2[[2]]) #> [1] 50 example_func(ex_list[[3]], ex_args1[[3]], ex_args2[[3]]) #> [1] 77 包可帮助您进行功能编程和迭代。您应该查看documentation,因为它可以帮助您完成其他任务,例如使用purrr write.csv进行迭代。

使用数据框提供迭代列表并通过命名参数进行匹配的一个示例。

purrr::walk