关于在R中解包列表的困惑

3
我很困惑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的第一个元素不是数据框,而需要进行两次引用才能获取元素。我阅读了Hadley Wickham在其高级R网站上的出色的“数据结构”章节,但仍然无法理解这个例子的问题所在。有人能够解释一下我错过了什么吗?


1
你可能会对 [[ 的含义感到困惑。因为你没有嵌套 [,所以将其称为“双引用”可能不准确。[[ 是它自己的运算符(实际上是一个函数)。 - shadowtalker
2个回答

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

请参见?[向量列表以获取更多信息。以下SO帖子可能有所帮助:

1
一个很好的参考是R地狱第8.1.54节“列表下标”。 - Metrics

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的第一个元素。
希望这样说您能明白。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接