在R中通过引用传递列表并添加到列表

在R中通过引用传递列表并添加到列表,r,pass-by-reference,R,Pass By Reference,我在R中有一个函数,它应该通过向列表添加新项来修改列表。然而,我真的不想复制我的清单 我知道这在R中不是一项容易的任务,我已经看到了一些使用eval.parent函数的最小示例,但我不知道它们将如何应用于我的特定情况 我的问题(不是我的实际函数)的一个最小示例如下 L <- list(o1 = 1, o2 = 2, o3 = 3) add_to_list <- function(L){ n1 <- sum(unlist(L)) n2 <- mean(unlist(

我在R中有一个函数,它应该通过向列表添加新项来修改列表。然而,我真的不想复制我的清单

我知道这在R中不是一项容易的任务,我已经看到了一些使用eval.parent函数的最小示例,但我不知道它们将如何应用于我的特定情况

我的问题(不是我的实际函数)的一个最小示例如下

L <- list(o1 = 1, o2 = 2, o3 = 3)
add_to_list <- function(L){
  n1 <- sum(unlist(L))
  n2 <- mean(unlist(L))
  L$n1 <- n1
  L$n2 <- n2
  return(L)
}
L <- add_to_list(L)

L事实上,我认为添加到列表中并不会对前面的元素进行深度复制,
您可以使用base R进行测试:

x <- 1:2
tracemem(x)

y <- 3:4

L <- list(x=x, y=y)

foo <- function(L) {
  L$z <- 5:6
  L
}

# no copy shown here
L <- foo(L)

# copy shown, x copied so that L$x stays unmodified
x[1L] <- 0L

最好展示你想要得到什么,以得到其他答案。这可以通过
lappy
,否?关于“追加是否会复制列表”的问题可以让您更深入地了解
L=c(L,n1=sum(unlist(L)),n2=mean(unlist(L))
?另一种选择是使用环境而不是列表。好吧,追加/分配到环境不会产生副本。问题是我真的需要在函数中进行追加:一般来说,仅仅追加到列表可能不会产生副本,但修改传递给函数的项会产生该项的副本(除非在这个特定示例中不是这样)。一行程序也不是一个真正的选项,在我最终添加到列表之前,我真正且不简单的函数有大约50行代码,并且附加的项不是相互独立计算的(这样做会进一步增加计算时间)。你是对的,我测试了这一点,事实上,即使在函数中执行,添加到列表也不会复制项目,谢谢:)
library(pryr)

x <- 1:2
address(x)
[1] "0x26f5f344ba0"

foo <- function(L) {
  L$z <- 5:6
  L
}

L <- list(x=x)
L <- foo(L)
lx <- L$x

address(lx)
[1] "0x26f5f344ba0"