我有一个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]])
2条答案
按热度按时间pwuypxnk1#
您的
for
循环中缺少一个右括号,但除此之外,您的代码应该可以工作。我将定义一个普通的some_function()
来演示:如果即使使用了正确的方括号,您的示例也可以在循环中工作,但不使用
imap
,我怀疑S4对象的使用是否相关。如果你有一个命名列表,你可能会被绊倒。从
imap
docs:imap_xxx(x,...)是索引Map,如果x具有名称,则imap_xxx(x,...)是map2(x,名称(x),...)的简写,或者如果map2(x,seq_along(x),...)没有名称,则imap_xxx(x,...)是map2(x,名称(x),...)的简写。
参见示例:
请确保在索引而不是名称上循环,并且输出应该相同。
rdlzhqv92#
你也可以用
purrr::pmap()
来实现这一点,它可以并行Map任意数量的列表(在超级列表中传递):