我有一个列表l
:
l <- list(c(1,2),c(3,4))
我想检索此列表第一个元素的引用。 换句话说,如果我这样做,我想要这样:
l1 <- getRef(l,1)
l1[1] <- 0
然后l
也会被修改。
我怎么能在R?中做那样的事情?
答案 0 :(得分:3)
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具有价值语义而不是反对它的事实。
答案 1 :(得分: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是只读的。
虽然,我一般不鼓励这样的结构。