如何理解r中的列表(列表(对象))?

it_*_*ure 5 r

一个列表

list("haha")
[[1]]
[1] "haha"
Run Code Online (Sandbox Code Playgroud)

列表清单

list(list("haha"))
[[1]]
[[1]][[1]]
[1] "haha"
Run Code Online (Sandbox Code Playgroud)

我无法理解输出 list(list("haha")),在我的意见中输出应该是:

list(list("haha"))
[[1]]
[[1]]
[1] "haha"
Run Code Online (Sandbox Code Playgroud)

这里的魔力是什么?

gun*_*ica 1

在 R 中,列表是有序的组件集(请参见此处)。它们的索引与向量等其他数据结构不同。考虑一下如果你的第一个例子是一个向量,它会是什么样子:

> c("haha")
[1] "haha"
Run Code Online (Sandbox Code Playgroud)

[1]只是简单地列举您的结果以便于参考。在这种情况下,[1]没有太大帮助,因为很明显,结果中只有一个元素,即"haha"第一个元素,但如果向量足够长,这些符号将有助于确定后面元素的位置。

由于您有一个list,因此输出的索引(和外观)有所不同:

> list("haha")
[[1]]
[1] "haha"
Run Code Online (Sandbox Code Playgroud)

现在您有两个1索引您的结果。这看起来有点模棱两可,但正如 @Henrik 和 @Stephen Henderson 指出的,这部分是因为您的列表中只有一个组件。无论如何,[[1]]告诉您接下来的是第一个组件,并且[1]再次简单地枚举该组件内的结果。由于只有一个组件,而该组件又只包含一个元素,因此严格来说这是不必要的,但当您的列表有更多内容时,这会变得更有帮助。

请注意,列表的组件和包含的元素始终已编号,并且可以通过这些编号进行访问。但它们也可以被命名,在这种情况下,输出看起来有点不同:

> list(chuckle="haha")
$chuckle
[1] "haha"
Run Code Online (Sandbox Code Playgroud)

现在[[1]]不会与结果一起显示,但它仍然存在,您仍然可以使用它来访问列表的组件:

> l <- list(chuckle="haha")
> l$chuckle
[1] "haha"
> l[[1]]
[1] "haha"
Run Code Online (Sandbox Code Playgroud)

您现在有两个选择;如果您更喜欢使用它[[1]],仍然存在,尽管它不是 R 默认打印的内容。进一步注意,[1]仍然会与您的结果一起打印以枚举它们。

如果我们有一个组件包含多个元素的列表,可能会更容易看到其中一些功能:

> list(letters[1:20])
[[1]]
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m"
[14] "n" "o" "p" "q" "r" "s" "t"
Run Code Online (Sandbox Code Playgroud)

只需一个(未命名)组件,我们就可以获得标准的[[1]]. 枚举[1]结果的第一个元素,并且由于所有结果不能放在一行中,所以它[14]有用地告诉我们这"n"是第十四个元素。现在,将 计数为"s"第十九个元素比我们必须从 开始计数更容易"a"

如果我们有一个包含多个组件的列表怎么办?最简单的情况是将向量作为组件:

> list(c("haha", "hehe"), c("hoho", "hehheh"))
[[1]]
[1] "haha" "hehe"

[[2]]
[1] "hoho"   "hehheh"
Run Code Online (Sandbox Code Playgroud)

结果准确地表明有两个组成部分。第一个组件用 表示[[1]],并且该组件的元素从 开始枚举[1]。清楚地显示有两个组件,以及每个组件中包含哪些元素。您可以使用它们来访问所需的元素:

> ll <- list(c("haha", "hehe"), c("hoho", "hehheh"))
> ll[[2]][2]
[1] "hehheh"
Run Code Online (Sandbox Code Playgroud)

索引[[2]]第二个分量(即向量c("hoho", "hehheh"))并[2]检索该向量的第二个元素。请注意[1],尽管在这一特定情况下只能有一个元素,但仍会打印结果。

对于更复杂的情况,让我们看一下列表的列表而不是向量的列表:

> list(list("haha", "hehe"), list("hoho", "hehheh"))
[[1]]
[[1]][[1]]
[1] "haha"

[[1]][[2]]
[1] "hehe"


[[2]]
[[2]][[1]]
[1] "hoho"

[[2]][[2]]
[1] "hehheh"
Run Code Online (Sandbox Code Playgroud)

现在一团糟。令人困惑的是,输出表示三个组件(或者至少[[1]]顶部有三个 s),但尚不清楚这三个组件可能是什么。外部列表有两个组成部分,每个内部列表有两个组成部分。当分量是向量时,结果看起来不像这样。答案是您得到的外部列表被标记了两次。结果的第一[[1]]行告诉您接下来的内容来自第一个组件。在结果的下一行,[[1]][[1]]告诉您接下来的是第一个组件的第一个组件(即使它只是告诉您这些结果属于第一个组件)。如果组件被命名的话,它看起来像这样:

> list(chuckles=list("haha", "hehe"), guffaws=list("hoho", "hehheh"))
$chuckles
$chuckles[[1]]
[1] "haha"

$chuckles[[2]]
[1] "hehe"


$guffaws
$guffaws[[1]]
[1] "hoho"

$guffaws[[2]]
[1] "hehheh"
Run Code Online (Sandbox Code Playgroud)

现在更容易看出它连续两次向您提供某些信息。请注意如果您只请求一个组件会发生什么:

> lll <- list(list("haha", "hehe"), list("hoho", "hehheh"))
> lll[[1]]
[[1]]
[1] "haha"

[[2]]
[1] "hehe"
Run Code Online (Sandbox Code Playgroud)

指定我们只对第一个(外部)组件感兴趣,它并没有告诉我们这是连续两次的第一个组件。不过,它确实指示了内部组件并枚举了所包含的元素。

在您的示例中很难看到所有这些,因为您有一个仅包含一个组件的嵌套列表,其中仅包含一个仅包含一个元素的组件,并且它们都没有被命名。尽管如此,结果表示第一个组件,然后在第一个组件内(再次)表示第一个(包含的)组件,然后返回结果并枚举第一个(实际上唯一的)元素:

> list(list("haha"))
[[1]]
[[1]][[1]]
[1] "haha"
Run Code Online (Sandbox Code Playgroud)