【问题标题】:How to retrieve the reference of an object stored in a list?如何检索存储在列表中的对象的引用?
【发布时间】:2015-10-30 11:11:24
【问题描述】:

我有一个列表l:

l <- list(c(1,2),c(3,4))

我想检索此列表第一个元素的引用。 换句话说,如果我做类似的事情,我想要这样:

l1 <- getRef(l,1)
l1[1] <- 0

那么l也会被修改。

我怎样才能在 R 中做类似的事情?

【问题讨论】:

  • 它是对列表第一个元素的引用。即通过引用修改对象也会修改列表的第一个元素。
  • R 使用修改时复制语义。最初 l1 指向索引 1 处的对象。一旦更改该对象,l1 就会获取原始对象的副本并对其进行修改。没有办法解决这个问题。
  • @zx8754 谢谢。是的。

标签: r list reference


【解决方案1】:

R 不支持这一点,因为在 R 中,所有对象(环境除外)都有值语义,而不是引用语义。

这样做的唯一方法是通过环境(或在环境之上构建的东西,例如 R6 类)。

作为一个简单的例子(注意你需要在这里提供名字):

lenv = function (...) list2env(list(...))
l = lenv(x = lenv(a = 1, b = 2), y = lenv(a = 3, b = 4))

现在你可以做

l1 = l$x
l1$a = 2
l$x$a
# 2

……但这很复杂,效率低下,而且大多数时候不是你想做的。接受 R 具有值语义而不是与之对抗这一事实。

【讨论】:

    【解决方案2】:

    你可以像这样使用makeActiveBinding函数:

    l <- list(c(1,2),c(3,4))
    makeActiveBinding("l1", function() l, .GlobalEnv)
    l[1] <- 0
    l1
    #[[1]]
    #[1] 0
    #
    #[[2]]
    #[1] 3 4
    

    但是,这种方式 l1 是只读的。

    不过,一般来说,我不鼓励这种结构。

    【讨论】:

      猜你喜欢
      • 2013-10-03
      • 2014-01-31
      • 2013-03-08
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2021-02-02
      • 2020-07-22
      相关资源
      最近更新 更多