R: Подмножество в перегруженных [[и [[<- - - PullRequest
0 голосов
/ 17 апреля 2019

Если у нас есть список, мы можем использовать вложенные значения, используя [[ напрямую или используя вектор.

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"]] поведение - это то, что я ожидаю.

Почему он ведет себя по-разному в перегруженных частях?

...