【问题标题】:array of lists in rr中的列表数组
【发布时间】:2011-04-18 16:54:49
【问题描述】:

假设如果我想要有 10 个元素的数组,每个元素都是一个列表/映射。我正在这样做:

x = array(list(), 10)
x[1][[ "a" ]] = 1
Warning message:
In x[1][["a"]] = 1 :
  number of items to replace is not a multiple of replacement length
>

这是正确的方法吗?我希望数组的每个元素都是一个映射。

【问题讨论】:

    标签: arrays r map


    【解决方案1】:

    您所称的“数组”通常只是在 R 中称为列表。您会被 [[[ 之间的区别绊倒。请参阅help("[") 中的“递归(类列表)对象”部分。

    x[[1]][["a"]] <- 1
    

    更新:
    请注意,上面的解决方案创建了一个命名向量列表。换句话说,像

    x[[1]][["a"]] <- 1
    x[[1]][["b"]] <- 1:2
    

    不会起作用,因为您不能为向量的一个元素分配多个值。如果您希望能够将向量分配给名称,则可以使用列表列表。

    x[[1]] <- as.list(x[[1]])
    x[[1]][["b"]] <- 1:2
    

    【讨论】:

    • OP 创建数组的方式,它实际上是一个数组,每个元素都是一个列表。问题是x[1] 中的列表没有名称,因此x[1][[ "a" ]] 返回NULL,但我们试图将长度为1 的向量分配给length(0) 索引。如果您使用x[1][[ 1 ]],它会起作用,但正如您所说,如果 OP 直接使用列表而不是数组,效果会更好。
    【解决方案2】:

    如果你真的想要这样做,那么,因为数组的每个元素中的列表元素没有名称,你不能用字符向量来索引。在您的示例中,没有x[1][[ "a" ]]

    > x[1][[ "a" ]]
    NULL
    

    如果没有名称,则需要按数字索引:

    > x[1][[ 1 ]] <- 1
    [1] 1
    

    列表似乎比数组更合乎逻辑:

    > y <- vector(mode = "list", length = 10)
    > y
    [[1]]
    NULL
    
    [[2]]
    NULL
    
    [[3]]
    NULL
    
    [[4]]
    NULL
    
    [[5]]
    NULL
    ....
    

    【讨论】:

    • array(list(), 10) 创建一个带有 dim 属性的列表,因此它与您的列表非常相似。
    • @Joshua 是的,它创建了一个数组列表混合 - R 认为它确实是一个数组(is.array(x)TRUE)。我认为列表更整洁。
    • 我不记得is.array 是如何工作的,但?is.array 建议它只是寻找具有正长度的dim 属性。
    猜你喜欢
    • 2018-10-16
    • 2017-01-23
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2020-05-15
    • 2019-01-19
    相关资源
    最近更新 更多