R: подмножество в перегруженных [[ и [[<-

#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))) . Итак, где происходит это переназначение, если не в перегруженной функции? Я не уверен, что это ясно объясняет мои сомнения.