如何使用R中的'purrr'包代替for循环来迭代索引

x7yiwoj4  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(174)

我有一个S4对象的列表,我尝试在这些列表上迭代一个函数,我选择了一个索引位置,然后从该位置提取我感兴趣的关键字。我可以执行for循环并成功应用该函数,但是否可以使用purrr包来完成此操作?我不确定如何准确地复制S4对象,因此,我提供了一个非常高级的示例,以了解我的流程。

list_1 <- list("Sample", "test", "test Date")
list_2 <- list("test", "sample", "test Date")
listoflists <- list(list_1, list_2)

我创建了一个“样本”的索引列表:

groupList <- map(listoflists,~which(toupper(.) == "SAMPLE"))

以及我想提取的关键字列表:

keywordsList <- list(c("One test", "two test"), c("one test", "two test"))

我有一个函数,它接受S4对象,选择找到“sample”的索引,并从中提取关键字。

for(i in seq_along(listoflists){
output[[i]] <- some_function(listoflists[[i]], index = groupList[[i]], keywords = keywordsList[[i]]) }

我尝试使用imap,但似乎这样做时,输出的子列表只有1个关键字(比如第一个列表中的“One test”和第二个列表中的“two test”),而不是3个:

output <- listoflists %>% imap(~some_function(.x,index = groupList[[.y]], keywords = keywordsList[[.y]])
pwuypxnk

pwuypxnk1#

您的for循环中缺少一个右括号,但除此之外,您的代码应该可以工作。我将定义一个普通的some_function()来演示:

some_function <- function(x, index, keywords) {
    c(x[[index]], keywords)
}

loop_output <- vector(mode = "list", length = length(listoflists))
for (i in seq_along(listoflists)) {
    loop_output[[i]] <- some_function(listoflists[[i]], index = groupList[[i]], keywords = keywordsList[[i]])
}

purr_output <- imap(
    listoflists,
    ~ some_function(
        .x,
        index = groupList[[.y]],
        keywords = keywordsList[[.y]]
    )
)

identical(loop_output, purr_output)
# TRUE

如果即使使用了正确的方括号,您的示例也可以在循环中工作,但不使用imap,我怀疑S4对象的使用是否相关。
如果你有一个命名列表,你可能会被绊倒。从imapdocs
imap_xxx(x,...)是索引Map,如果x具有名称,则imap_xxx(x,...)是map2(x,名称(x),...)的简写,或者如果map2(x,seq_along(x),...)没有名称,则imap_xxx(x,...)是map2(x,名称(x),...)的简写。
参见示例:

listoflists <- list(list_1, list_2)
imap(listoflists, ~.y)
# [[1]]
# [1] 1

# [[2]]
# [1] 2

listoflists <- list(l1 = list_1, l2 = list_2)
imap(listoflists, ~.y)
# $l1
# [1] "l1"

# $l2
# [1] "l2"

请确保在索引而不是名称上循环,并且输出应该相同。

rdlzhqv9

rdlzhqv92#

你也可以用purrr::pmap()来实现这一点,它可以并行Map任意数量的列表(在超级列表中传递):

output <-
  pmap(.l = list(listoflists, index = groupList, keywords = keywordsList),
       .f = some_function)

相关问题