Если у нас есть список, мы можем использовать вложенные значения, используя [[
напрямую или используя вектор.
my_list <- list("main" = list(
"a" =
list("aa" = list(
"aaa" = list("aaaa" = 0),
"aaA" = 10
),
"AA" = 20),
"b" = list("bb" = list(), "BB" = list(10))
))
my_list1 <- my_list
my_list1[["main"]][["a"]][["aa"]][["aaa"]][["aaaa"]] <- 145
my_list1[[c("main", "a", "aa", "aaa", "aaaa")]] <- 2222
Теперь у нас есть закрытие с перегруженными [[
и [[<-.my_class
:
dcon <- function(){
data <- list()
return(structure(function(named_list = NULL){
force(named_list)
if(!is.null(named_list)){
for (na in names(named_list)){
data[[na]] <<- named_list[[na]]
}
return(NULL)
} else {
return(data)
}
},
class = "my_class"))
}
`[[.my_class` <- function(dcon, name){
return(.subset2(dcon(), name))
}
`[[<-.my_class` <- function(dcon, name, value){
input <- list()
input[[name]] <- value
dcon(input)
return(dcon)
}
my_list2 <- dcon()
my_list2(my_list)
my_list2[["main"]][["a"]][["aa"]][["aaa"]][["aaaa"]] <- 2222
Измененные списки выглядят одинаково.
identical(my_list2(), my_list1) # TRUE
my_list2[["main"]][["b"]][["bb"]][["bbb"]] <- list(878)
identical(my_list2()[["main"]][["a"]], my_list1[["main"]][["a"]]) # TRUE
Вопрос - как возможно, что эта часть:
data[[na]] <<- named_list[[na]]
работает, а что-то вроде этого (что, на мой взгляд, эквивалентно вышеприведенному):
my_list1[["main"]] <- list("a" = list("aa" = list("aaa" = list("aaaa" = 2222))))
что-то другое?my_list1[["main"]]
поведение - это то, что я ожидаю.
Почему он ведет себя по-разному в перегруженных частях?