【问题标题】:Extracting vectors from list in R without looping从R中的列表中提取向量而不循环
【发布时间】:2015-10-02 07:03:27
【问题描述】:

这可能是一个非常简单的问题,但是我已经用谷歌搜索了几个小时,但没有一个令人满意的答案。假设我有一个类似下面的列表:

theList <- list(c("de", "labore", "solis"), c("sapiento", "post", "eventum"), c("sursum", "corda"))

> theList
[[1]]
[1] "de"     "labore" "solis" 

[[2]]
[1] "sapiento" "post"     "eventum" 

[[3]]
[1] "sursum" "corda" 

如果我想打印构成列表的所有向量,我会想到类似

for(i in 1:length(theList)) {
  print(theList[[i]])
}

[1] "de"     "labore" "solis" 
[1] "sapiento" "post"     "eventum" 
[1] "sursum" "corda" 

但是必须有一个更优雅的解决方案,可能使用 apply 家族的一些成员......

【问题讨论】:

  • 你只想要unlist(theList)吗?或者invisible(sapply(theList, print))。只是格式的问题吗?
  • 不怕;我想访问列表中的每个向量并对其进行处理(在此示例中打印),同时保留列表
  • 这让事情变得更不清楚了。你到底需要代码做什么?我展示了一个sapply 示例。我只是使用invisible() 来抑制默认返回值,因为您只是在打印。
  • 那么 lapplysapply 是显而易见的答案。你用什么课本来学习R? ...或者您只是在使用“锤子和希望”策略?

标签: r


【解决方案1】:

我想我在进行了更多的谷歌搜索和实验后得到了答案......

extract <- function(m) {
  sapply(seq_along(m), function(x) m[[x]])
}

> extract(theList)
[[1]]
[1] "de"     "labore" "solis" 

[[2]]
[1] "sapiento" "post"     "eventum" 

[[3]]
[1] "sursum" "corda" 

因此,只需对sapply 的结果执行所需的操作(例如打印)

【讨论】:

  • 也许我遗漏了一些东西,但是这个输出与原始的 theList 有何不同?
  • 我们很清楚:您的 extract 函数实际上什么也没做。它拿了一个列表,然后简单地返回了列表。仅此而已(除了一堆什么也没做的循环)。
  • 抱歉,如果我没有让自己足够清楚:这个想法是以 list[[i]] 方式访问组成列表的每个向量并对每个向量执行一些操作(打印是一个简单的例子,但例如我本可以去掉每个向量中的所有元音),但不必使用 for 循环
  • 对不起,投反对票,因为这不是在 R 中做任何事情的正确方法,因此对未来的访问者来说不是一个有益的问答。为了说明你的例子,你应该做rid_vowels &lt;- function(x) gsub("[aeiou]","",x)然后sapply(theList,rid_vowels)
  • ...您应该仔细阅读sapplylapply,然后才能得出其中一个适合您的用例的结论。
猜你喜欢
  • 2012-02-18
  • 2012-10-04
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多