7

假设我有一个嵌套在列表中的列表,并且我有一些仅适用于向量的函数(例如 stringr 包中的 str_replace )。该功能应该对实际需要信息的每个元素进行工作,...

问题1:我的问题有具体的解决方案吗?
问题2:有没有通用的解决方案?

应该有一个使用循环的解决方案,但这几乎是优雅的并且可能非常缓慢 - 效率确实在这里发挥了作用。

让我们举个例子

# let's start easy:
test1 <- list(c("a","d"),c("b","d"),c("c","d"))

# does not work:
str_replace(test1,"d","changed")

# but this does:
lapply(test1,str_replace,"d","changed")

# but what now ?
test2 <- list(c(list("a"),"d"),c("b","d"),c("c","d"))

# does not work! :-(
lapply(test2,str_replace,"d","changed")
4

3 回答 3

7

以下是如何使用 rapply 来实现这一点。注意 ... 在 rapply 的定义中的位置 - 这是在dfltand之后how。因此,我们将参数命名为 str_replace:

rapply(test,str_replace,pattern="d",replacement="changed",how='replace')

[[1]]
[[1]][[1]]
[1] "a"

[[1]][[2]]
[1] "changed"


[[2]]
[1] "b"       "changed"

[[3]]
[1] "c"       "changed"
于 2012-11-24T18:57:29.703 回答
3

您可以使用unlist/ relist

library(stringr)
test <- list(c(list("a"),"d"),c("b","d"),c("c","d"))
test2 <- unlist(test)
test2 <- str_replace(test2,"d","changed")
relist(test2,test)

[[1]]
[[1]][[1]]
[1] "a"

[[1]][[2]]
[1] "changed"


[[2]]
[1] "b"       "changed"

[[3]]
[1] "c"       "changed"

我相信这是非常有效的,但尚未测试。

于 2012-11-24T18:57:00.473 回答
2

rapply递归地将函数应用于每个列表元素。您可能必须尝试使用​​该参数how才能获得正确的输出,但它应该可以满足您的需求。

rapply文档在这里

于 2012-11-24T18:53:06.203 回答