如何通过引用修改 R6class 对象列表?
how to modify a list of R6class objects by reference?
看这个简短的例子:
library(R6)
library(pryr)
Person <- R6Class("Person", public = list(name = NA, hair = NA, initialize = function(name,
hair) {
if (!missing(name)) self$name <- name
if (!missing(hair)) self$hair <- hair
}, set_hair = function(val) {
self$hair <- val
}))
ann <- Person$new("Ann", "black")
address(ann)
#> [1] "0x27e01f0"
ann$name <- "NewName"
address(ann)
#> [1] "0x27e01f0"
ann2 <- Person$new("Ann", "white")
g <- c(ann, ann2)
address(g)
#> [1] "0x32cc2d0"
g[[1]]$hair <- "red"
address(g)
#> [1] "0x34459b8"
我原以为操作 g[[1]]$hair <- "red"
会像 ann$name <- "NewName"
一样通过引用更改 g
。有办法实现吗?
g
只是一个向量,所以它没有引用语义。
尽管如此,您还是得到了一个新对象 g
,它引用了相同的对象 ann
和 ann2
。
您可以通过 address(g[[1]])
验证
如果你不想改变g
,你必须从g
中提取对象,然后调用赋值方法。
address(g)
##[1] "0000000019782340"
# Extract the object and assign
temp <- g[[1]]
temp$hair <- "New red"
address(g)
[1] "0000000019782340"
#Verify the value on g
g[[1]]$hair
##[1] "New red"
address(g)
#[1] "0000000019782340"
看这个简短的例子:
library(R6)
library(pryr)
Person <- R6Class("Person", public = list(name = NA, hair = NA, initialize = function(name,
hair) {
if (!missing(name)) self$name <- name
if (!missing(hair)) self$hair <- hair
}, set_hair = function(val) {
self$hair <- val
}))
ann <- Person$new("Ann", "black")
address(ann)
#> [1] "0x27e01f0"
ann$name <- "NewName"
address(ann)
#> [1] "0x27e01f0"
ann2 <- Person$new("Ann", "white")
g <- c(ann, ann2)
address(g)
#> [1] "0x32cc2d0"
g[[1]]$hair <- "red"
address(g)
#> [1] "0x34459b8"
我原以为操作 g[[1]]$hair <- "red"
会像 ann$name <- "NewName"
一样通过引用更改 g
。有办法实现吗?
g
只是一个向量,所以它没有引用语义。
尽管如此,您还是得到了一个新对象 g
,它引用了相同的对象 ann
和 ann2
。
您可以通过 address(g[[1]])
如果你不想改变g
,你必须从g
中提取对象,然后调用赋值方法。
address(g)
##[1] "0000000019782340"
# Extract the object and assign
temp <- g[[1]]
temp$hair <- "New red"
address(g)
[1] "0000000019782340"
#Verify the value on g
g[[1]]$hair
##[1] "New red"
address(g)
#[1] "0000000019782340"