【问题标题】:Can I override an element of a list, when original element is a length 2 numeric vector?当原始元素是长度为 2 的数字向量时,我可以覆盖列表的元素吗?
【发布时间】:2015-12-08 19:54:26
【问题描述】:

当原始元素是长度为 2 的数字向量时,我可以在 R 语言中覆盖列表的元素吗?

l <- list(a=c(3,5),b=2,c=3) # OK, CREATED a list s.t. element 'a' is a 2-length vector
l['b'] <- 8 # OK, overrided a named element 'b' of the list with a 1-length vector.
l['a'] <- c(4,5) # "Warning" emitted
(l) # BAD

它会引发警告。更糟糕的是,列表不会更新为新值。需要一些解决方法来更新预先存在的列表的 2 长度向量元素。可能会再次执行一个全新的列表构造函数——避免覆盖元素——如果很明显如何通用地编写代码。我还不知道如何在 R 中编写该代码。

这是 R 版本 3.2.2 (2015-08-14) -- “消防安全” 版权所有 (C) 2015 统计计算 R 基金会 平台:x86_64-pc-linux-gnu(64位)

【问题讨论】:

  • 使用l[['a']] &lt;- c(4,5)。对于列表,您应该使用双括号来引用元素。

标签: r


【解决方案1】:

使用这个:

l[['a']] <- c(4,5)

答案归功于 Sam Dickson。

【讨论】:

    【解决方案2】:

    其实,你原来的答案可能已经不远了!

    试试l['a'] &lt;- list(c(4,5))

    您只需将替换格式设置为列表。当您像['a'] 这样子集时,会返回一个列表;当您将子集设置为[['a']] 时,无论 in 是什么,都会返回该列表的第 a 个元素(在本例中为长度为 2 的向量)。这就是你遇到麻烦的原因。您将长度 2 提供给长度为 1 的东西,而 包含 长度为 2 的东西。

    另外,如果您喜欢自己的答案,您还可以在命名列表时使用l$a。就个人而言,我更喜欢你的方法(尽管它不那么紧凑,但我喜欢它与子集其他类似对象的一致性......当它们看起来都相同时,我的眼睛更容易捕捉到子集操作)。

    祝你好运!

    编辑:只是为了形象化,注意列表的a 元素最初是c(3,5)

    > l['a'] <- list(c(4,5)) # works!!!
    > l
    $a
    [1] 4 5
    
    $b
    [1] 2
    
    $c
    [1] 3
    

    【讨论】:

    • @RichardScriven 好点!事实上,这个名字没有任何作用(即使它不同)!我会改变的。谢谢。
    猜你喜欢
    • 2021-01-30
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多