如何理解r中的list(list(object))?

如何理解r中的list(list(object))?,r,R,单子 名单 list("haha") [[1]] [1] "haha" 我无法理解list(list(“haha”))的输出,在我看来,输出应该是: list(list("haha")) [[1]] [[1]][[1]] [1] "haha" 这里的魔力是什么 list(list("haha")) [[1]] [[1]] [1] "haha" 最后的[1]是因为R中没有字符串;只是长度可能为1的字符向量 list(list("haha")) [[1]] # the contents of

单子

名单

list("haha")
[[1]]
[1] "haha"
我无法理解
list(list(“haha”))
的输出,在我看来,输出应该是:

list(list("haha"))
[[1]]
[[1]][[1]]
[1] "haha"
这里的魔力是什么

list(list("haha"))
[[1]]
[[1]]
[1] "haha"
最后的[1]是因为R中没有字符串;只是长度可能为1的字符向量

list(list("haha"))
[[1]] # the contents of the first element of the outer list
    [[1]] # the contents of the first element of the inner list
        [1] "haha" # the first (and only) element of the character vector 'haha'
在我看来,列表的R print语句是可怕的。因此,您有两个有用的选项:

1:使用dput输出列表的代码。这对命名列表或非常复杂的列表不起作用

[[ 1 ]]: the contents of a container. list( 1 )[[1]] is 1
[1]: an element of the container. list( 1, 2 )[1] is list(1)
2:使用str检查列表的结构。这可能非常有用,但有时很难解释:

dput( list(list("haha")) )
list(list("haha"))

希望这能有所帮助。

我同意这种格式看起来很奇怪,但一旦你开始在列表中放置多个对象,它就变得更有意义了,这样就不会有太多的冗余:

 str(list(list('haha')))
 List of 1
     $ :List of 1
      ..$ : chr "haha"
虽然我想它可能不会那么冗长

编辑为@Henrik添加: 或者显然是:

> L[[1]][[2]]
[1] "hoho"
L[[2]][[1]]
[1] "heehee"
>L
美元优先
$first$x
[1] “哈哈”
$first$y
[1] “呵呵”
美元秒
$second$a
[1] “嘻嘻”
$second$b
[1] “狂笑”

在R中,列表是组件的有序集合(请参阅)。它们的索引不同于向量等其他数据结构。考虑一下,如果第一个例子是向量,那么它是如何看起来的:

> L<-list(first=list(x="haha", y="hoho"), second=list(a="heehee", b="guffaw"))
> L
$first
$first$x
[1] "haha"

$first$y
[1] "hoho"


$second
$second$a
[1] "heehee"

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

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

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

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

> list("haha")
[[1]]
[1] "haha"
现在,
[[1]]
不会显示结果,但它仍然存在,您仍然可以使用它访问列表的一个组件:

> list(chuckle="haha")
$chuckle
[1] "haha"
只有一个(未命名)组件,我们就得到了标准的
[[1]]
[1]
枚举结果的第一个元素,由于所有结果不适合一行,
[14]
有助于告诉我们
“n”
是第十四个元素。将第十九个元素计数到
“s”
比从
“a”
开始更容易

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

> 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"
结果准确地表明,有两个组成部分。第一个组件表示为
[[1]]
,该组件的元素从
[1]
开始枚举。有两个组件,并且清楚地显示每个组件中包含哪些元素。您可以使用这些来访问所需的元素:

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

[[2]]
[1] "hoho"   "hehheh"
现在这真是一团糟。令人困惑的是,输出表示三个组件(或者至少在顶部有三个
[[1]]]
s),但不清楚这三个组件可能是什么。外部列表有两个组件,每个内部列表有两个组件。当组件是向量时,结果不是这样的。答案是,您将得到两次表示的外部列表。结果第一行的
[[1]]
告诉您下面的内容来自第一个组件。在结果的下一行,
[[1]][[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"
现在更容易看出,它连续两次向您提供某些信息。请注意,如果只要求一个组件,会发生什么情况:

> 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"

我认为令人困惑的是,输出中列出了3个
[[1]]
。你的解释有道理,但只列出/解释了2`[[i]]]。你能解释一下吗?这是一个有用的例子,但是你能提供一些解释不同索引的含义的注释来帮助他们理解(并且可能重新连接到原来的问题)吗?对不起,我的意思是,如果你考虑@ RyangGrnele的答案,他列出了不同的索引和它们所指示的,但他只解释了3个中的2个,这使得解释模棱两可。通过在列表中包含更多层次结构,您的示例可以说明每个索引所代表的内容。这是一个有用的方法&我认为这对OP非常有帮助。如果你随后将解释与OP的示例联系起来,我认为这将是关键。@gung,也请参见我上面的评论。@Henrik,将其转化为正确的答案可能会很有用。@Henrik一点问题也没有:)基本上,尽管我认为我们无法“解释”表示中的冗余-这是某人的选择,我们可以“展示”它是如何在所有
[[1]]:s
中容易丢失的。如果命名列表对象,可能会更好地了解输出的层次结构。然后将其与您未命名的案例进行比较,并尝试确定逻辑。例如,
我会为这件事耽搁了多久道歉;我希望这是有帮助的。
> ll <- list(c("haha", "hehe"), c("hoho", "hehheh"))
> ll[[2]][2]
[1] "hehheh"
> 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"
> 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"
> lll <- list(list("haha", "hehe"), list("hoho", "hehheh"))
> lll[[1]]
[[1]]
[1] "haha"

[[2]]
[1] "hehe"
> list(list("haha"))
[[1]]
[[1]][[1]]
[1] "haha"