R:重载[[和[[<-

时间:2019-04-17 15:42:16

标签: r overloading subset

如果有列表,则可以直接使用[[或使用向量对嵌套值进行子集化。

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"]]的行为是我所期望的。

为什么它在重载零件中表现不同?

0 个答案:

没有答案