关于在R中解压缩列表的困惑

时间:2015-03-13 21:28:58

标签: r

我对R如何处理列表和数据框感到困惑。例如:

agg = function() {
  df1 = data.frame(a=1:5,b=1:5)
  df2 = data.frame(a=11:15,b=11:15)  
  return(list(df1, df2))
}
res = agg()

# returns NULL
res[1]$a

# returns 1:5
res[[1]]$a

我不明白为什么res的第一个元素不是数据框;相反,我需要双引用来获取元素。我在他的Advanced R网站上阅读了Hadley Wickham的优秀数据结构章节,但仍然无法弄清楚这个例子是什么。任何人都可以解释我错过的东西吗?

2 个答案:

答案 0 :(得分:2)

单方括号[]用于索引R中的向量。双方括号[[]]用于索引列表。您有一个列表,因此[]不起作用:

is.list(res)
# [1] TRUE
str(res)
# List of 2
# $ :'data.frame':  5 obs. of  2 variables:
#  ..$ a: int [1:5] 1 2 3 4 5
#  ..$ b: int [1:5] 1 2 3 4 5
# $ :'data.frame':  5 obs. of  2 variables:
#  ..$ a: int [1:5] 11 12 13 14 15
#  ..$ b: int [1:5] 11 12 13 14 15

有关详细信息,请参阅?[vectorslists。以下SO帖子也可能有所帮助:

答案 1 :(得分:1)

列表的第一个元素是列表,因此agg[1]返回一个列表。 您正在寻找列表的第一个组件,该组件保存在agg[[1]]中。因此agg[[1]]$a有效。

,例如,看看以下

res[[1]]$a

res[1][[1]]$a

res[1][1][[1]]$a

res[1][1][1][[1]]$a

它们都返回列表第一个组件的列a。在这些情况下,它们都是相同的列表,即res的第一个元素。

希望这是有道理的。