2

我想列出对象并从所有对象中构建一个对象。实际用例是将多个 Seurat 对象组合成一个对象。目前我使用 for 循环,但是,我很好奇是否可以使用 purrr::map。为了使问题更简单,我们只连接列表的一部分。尽量不要对结果太可爱,因为我真正的问题更难(更复杂的功能)。

w1 = list(a="first",b="This")
w2 = list(a="second",b="is")
w3 = list(a="third",b="the")
w4 = list(a="fourth",b="desired results")

期望的结果将是“这是期望的结果”。

list(w1,w2,w3,w4) %>% map(paste,.$b," ")

[[1]] [1] “这个”

[[2]] [1] “是”

[[3]] [1] “这个”

[[4]] [1] “想要的结果”

我想保存上一次迭代的结果并将其作为参数添加到函数中。

基本上我想用函数替换以下行。

y=NULL;for (x in list(w1,w2,w3,w4)){ y=ifelse(is.null(y),x$b,paste0(y," ",x$b))}
#y
#"This is the desired result"
4

3 回答 3

4
library(purrr)

list(w1, w2, w3, w4) %>% 
  accumulate(~paste(.x, .y[2][[1]]), .init = '') %>% 
  tail(1) %>% 
  substr(2, nchar(.))

# [1] "This is the desired results"
于 2018-08-14T14:15:22.790 回答
4

使用do.calllapply在 Base R 中:

do.call(paste, lapply(list(w1,w2,w3,w4), `[[`, "b"))

# [1] "This is the desired results"
于 2018-08-14T14:22:04.170 回答
3

我会推荐这个使用purrr

list(w1,w2,w3,w4) %>% 
  map_chr("b") %>% 
  paste(collapse=" ")

我们可以传递一个字符串以map()仅返回该命名元素,并且由于我们只期望字符值,因此我们可以使用map_chr仅获取字符值的向量而不是列表。最后只需通过管道paste(collapse=)将它变成一个字符串。

但更一般地,如果你想逐步折叠,你可以使用reduce.

list(w1, w2, w3, w4) %>% 
  map_chr("b") %>%
  reduce(~paste(.x, .y))
于 2018-08-14T14:53:31.193 回答