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

时间:2019-04-26 12:11:53

标签: 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(L))
  L$n1 <- n1
  L$n2 <- n2
  return(L)
}
L <- add_to_list(L)

如果我是对的,那么在修改L时,函数add_to_list将制作L的完整副本,在此示例中,包括o1,o2和o3吗? (看起来是这样,当我查看实际函数的计算时间时。)

我想通过引用传递L,因为这将大大提高代码的性能。在我的真实示例中,有三个以上的对象o1,o2和o3,其中一些确实很大,在最终分配之前我也有很多代码,这就是为什么要将其模块化为功能。

1 个答案:

答案 0 :(得分:1)

实际上,我认为附加到列表并不能复制以前的元素, 您可以使用基本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

或使用pryr

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"