过滤并映射 R 中的列表

Filter and map over a list in R

我可以用 lapply:

在 R 中的列表上做一个映射
lapply(1:10,function(y) { if (y %% 2 == 0) {y+42}})

(这给了我一个 1 到 10 之间的列表,其中每个其他对象都是 NULL)。

此外,我可以使用 Filter:

删除每个 NULL 对象
Filter(function(x) !is.null(x),
       lapply(1:10,function(y) { if (y %% 2 == 0) {y+42}}))

(这给了我一个 1 到 10 之间的偶数列表)。

另一个例子,假设我们要获取一个字符串列表,并过滤掉所有以 "a" 开头的字符串,然后将 "Foo" 附加到剩余的字符串。可以使用类似的技术:

Filter(function(x) !is.null(x),
       lapply(c("foo","abar","baz"),
              function(y) { if (grepl("^a",y)) {paste("foo",y)}}))

有没有更好的方法在 R 中对列表进行折叠

你可以试试

y <- 1:10
as.list(y[y%%2==0]+42)

grep 也可以在向量中工作

grepl(paste(c(2,4,6), collapse="|"), y)
#[1] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE

y1 <- letters[1:10]
paste('foo', y1[grepl('^a', y1)])
#[1] "foo a"