我正在寻找一种在列表上映射函数的方法,但是能够为每次迭代赋予函数不同的输入。
一个简单的例子如下:
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
列表,然后在名称向量中找到该索引。有更好的方法吗?
答案 0 :(得分:5)
只需将其他值放在另外两个列表中,例如l2
和l3
。然后使用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