在 R 中通过引用传递列表并添加到列表
Pass list by reference in R and add to list
我在 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 不止三个,其中一些非常大,而且我在最终赋值之前还有很多代码,这就是为什么我希望将其模块化为函数。
实际上,我认为追加到列表并不会深度复制之前的元素,
你可以用 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
或 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"
我在 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 不止三个,其中一些非常大,而且我在最终赋值之前还有很多代码,这就是为什么我希望将其模块化为函数。
实际上,我认为追加到列表并不会深度复制之前的元素, 你可以用 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
或 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"