#r #overloading #subset
#r #перегрузка #подмножество
Вопрос:
Если у нас есть список, мы можем подмножить вложенные значения, используя [[
напрямую или используя вектор.
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"]]
поведение — это то, чего я ожидаю.
Почему он ведет себя по-разному в перегруженных частях?
Комментарии:
1. Мне трудно понять, в чем именно заключается ваш вопрос. Что именно вы подразумеваете под «работает» и «делает что-то другое»? Какого именно поведения вы ожидаете? В чем именно заключается проблема, которую вы пытаетесь решить?
2. @MrFlick Я пытался понять, почему это работает. Я только что заметил, что значение
value
переданного аргумента[[<-.my_class <- function(dcon, name, value)
уже изменено вложенный список — в использованном примере выполнениеmy_list2[["main"]][["a"]][["aa"]][["aaa"]][["aaaa"]]
упомянутых причинvalue
уже изменено :list(a = list(aa = list(aaa = list(aaaa = 2222), aaA = 10), AA = 20), b = list(bb = list(),BB = list(10)))
. Итак, где происходит это переназначение, если не в перегруженной функции? Я не уверен, что это ясно объясняет мои сомнения.