【问题标题】:Give name to list variable给列表变量命名
【发布时间】:2015-12-07 09:27:50
【问题描述】:

所以我们知道 R 有 list() 变量,也知道 R 有函数调用 names() 来为变量命名。例如:

a=30
names(a)="number"
a
# number
# 30

但是现在,我想给一个列表变量一个名字,像这样:

b=list()
names(b)="number"

它会返回如下错误消息:

Error in names(b) = "number" : 
'names' attribute [1] must be the same length as the vector [0]

我应该做什么?我这样做是因为我需要许多列表变量。或者,您有没有其他方法可以让我在不使用名称的情况下创建许多列表变量?

【问题讨论】:

  • 在前一种情况下,它的长度为 1,在list 中,它的长度为 0。如果你这样做 b = list(30); names(b) <- 'number' 应该可以工作

标签: r


【解决方案1】:

由于@akrun 不再需要点数,下面是一个示例,说明如何将名称分配给列表:

lst <- list(a="one", b="two", c=c(1:3))
names(lst)
[1] "a" "b" "c"
names(lst) <- c("x", "y", "z")

> lst
$x
[1] "one"

$y
[1] "two"

$z
[1] 1 2 3

【讨论】:

    【解决方案2】:

    您似乎对标记对象本身而不是其中的元素感兴趣。关键是列表对象的names 属性必须分配给它的元素。一种选择,因为您说您有很多列表对象,所以将列表存储在一个大列表中,然后您可以为大列表分配名称,并且列表对象中的元素也可以命名。

    allLists <- list('number' = list())
    
    > allLists
    $number
    list()
    

    另一种选择,您可以使用Hmisc 包中的label 功能。它将 R 中最常见的对象修改为具有“标记”的子类,因此每当您打印列表时,它都会显示标签。它有利于文档和更好地组织工作空间,但需要注意的是,很容易将标记的对象意外地转换为未标记的类,并混淆不考虑搜索多个类的方法。

    library(Hmisc)
    p <- list()
    label(p) <- 'number'
    
    > p
    number
    list()
    

    另一种选择是使列表对象的“名称”成为列表的实际元素。您会在许多复杂的 R 数据结构中看到,当出现此类需求但基本 R 数据结构无法满足时,这是存储标签、标题或名称的首选方式。

    b <- list('name' = 'number')
    

    最后一种可能性是您需要一个占位符来存储尚未填充列表的元素的“名称”属性。如果元素具有已知长度和已知类型,则可以使用例如分配这样的向量numeric(1) 一种可以命名的“primed”向量。如果您不知道输出的数据结构,我不会使用这种方法,因为在 R 中“构建”数据结构可能会占用大量内存。

    【讨论】:

    • 我认为这实际上是实际提出的问题的答案。
    • 我有一个问题:我有一个列表的嵌套列表(到目前为止有 2 个列表),有一些方法可以将列表中的第二个列表命名为:names(list[2]) &lt;- "nameoflist"
    【解决方案3】:

    其他可能性是

    as.list(a)
    # $`number`
    # [1] 30
    
    # or
    setNames(list(unname(a)),'number')
    # $`number`
    # [1] 30
    
    # or named list with named vector
    setNames(list(a), 'number')
    # $`number`
    # number 
    # 30
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-11
      • 2012-12-12
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多