因此,我使用R6 (我的老板偏好)用R语言编写了一个程序。它需要做一些繁重的数字运算,所以我尝试让R6类中的关键变量进行适当的修改。不幸的是,在普通R中,让变量就地修改的方法在R6类中似乎不起作用。我在下面构建了一个最小的例子。您可以清楚地看到R6类中的变量,该变量在函数之后跳转到一个新的内存地址。在R6类外部执行完全相同的操作会导致不复制。有没有人能给我一些建议,告诉我为什么要修改类中的变量,以及如何修改?
my_r6 <- R6Class("my_r6",
public = list(
test = function() {
for (i in 1:5) {
private$x$a[i] <- 3
}
}
),
private = list(
x = list(a = c(1, 2, 3, 4, 5))
)
)
temp_r6 <- my_r6$new()
tracemem(temp_r6$.__enclos_env__$private$x$a)
temp_r6$test()
y <- list(b = c(1, 2, 3, 4, 5))
tracemem(y$b)
for (i in 1:5) {
y$b[i] <- 3
}发布于 2018-04-12 06:18:01
您的代码并没有测试您认为它是什么。tracemem()不会告诉您对象是否已被就地修改。?tracemem的Details部分会告诉您是否调用了C函数duplicate()。
这(只有?)当多个名称/符号引用同一数据时发生。例如:
y <- list(b=1:5)
tracemem(y)
# [1] "<0000000009226B08>"
y[1] <- pi/2 # nothing else points to the same memory as 'y'
z <- y # now 'z' and 'y' point to the same memory
z[1] <- pi # this requires duplication of y
# tracemem[0x0000000009226b08 -> 0x00000000092228c8]:此外,R6类外部的代码与其内部的代码也不相同。private对象是一个环境,因此下面是一个更精确的比较。您可以看到它显示了与R6代码相同的重复项。
e <- new.env()
e$y <- list(b = c(1, 2, 3, 4, 5))
tracemem(e$y$b)
for (i in 1:5) {
e$y$b[i] <- 3
}
# tracemem[0x0000000008ff9c78 -> 0x000000000dac2298]:我不打算花时间调查或解释为什么会发生重复或避免它的方法,只是为了以防这是一个XY problem。如果这非常接近您的实际问题,请让我知道,我将尝试通过编辑来回答。
https://stackoverflow.com/questions/49777775
复制相似问题