Assigning NULL to a list element in R?

后端 未结 4 1093
囚心锁ツ
囚心锁ツ 2020-12-13 23:18

I found this behaviour odd and wanted more experienced users to share their thoughts and workarounds. On running the code sample below in R:

sampleList <-         


        
相关标签:
4条回答
  • 2020-12-13 23:44

    Good question.

    Check out the R-FAQ:

    In R, if x is a list, then x[i] <- NULL and x[[i]] <- NULL remove the specified elements from x. The first of these is incompatible with S, where it is a no-op. (Note that you can set elements to NULL using x[i] <- list(NULL).)

    consider the following example:

    > t <- list(1,2,3,4)
    > t[[3]] <- NULL          # removing 3'd element (with following shifting)
    > t[2] <- list(NULL)      # setting 2'd element to NULL.
    > t
    [[1]]
    [2] 1
    
    [[2]]
    NULL
    
    [[3]]
    [3] 4
    

    UPDATE:

    As the author of the R Inferno commented, there can be more subtle situations when dealing with NULL. Consider pretty general structure of code:

    # x is some list(), now we want to process it.
    > for (i in 1:n) x[[i]] <- some_function(...)
    

    Now be aware, that if some_function() returns NULL, you maybe will not get what you want: some elements will just disappear. you should rather use lapply function. Take a look at this toy example:

    > initial <- list(1,2,3,4)
    > processed_by_for <- list(0,0,0,0)
    > processed_by_lapply <- list(0,0,0,0)
    > toy_function <- function(x) {if (x%%2==0) return(x) else return(NULL)}
    > for (i in 1:4) processed_by_for[[i]] <- toy_function(initial[[i]])
    > processed_by_lapply <- lapply(initial, toy_function)
    > processed_by_for
      [[1]]
      [1] 0
    
      [[2]]
      [1] 2
    
      [[3]]
      NULL
    
      [[4]]
      [1] 4
    
    > processed_by_lapply
      [[1]]
      NULL
    
      [[2]]
      [1] 2
    
      [[3]]
      NULL
    
      [[4]]
      [1] 4
    
    0 讨论(0)
  • 2020-12-13 23:54

    Your question is a bit confusing to me.

    Assigning null to an existing object esentially deletes that object (this can be very handy for instance if you have a data frame and wish to delete specific columns). That's what you've done. I am unable to determine what it is that you want though. You could try

    sampleList[[2]] <- NA
    

    instead of NULL, but if by "I want to lose" you mean delete it, then you've already succeeded. That's why, "The list elements get shifted up."

    0 讨论(0)
  • 2020-12-14 00:04
    obj = list(x = "Some Value")
    obj = c(obj,list(y=NULL)) #ADDING NEW VALUE
    obj['x'] = list(NULL) #SETTING EXISTING VALUE
    obj
    
    0 讨论(0)
  • 2020-12-14 00:07

    If you need to create a list of NULL values which later you can populate with values (dataframes, for example) here is no complain:

    B <-vector("list", 2) 
    
    a <- iris[sample(nrow(iris), 10), ]
    b <- iris[sample(nrow(iris), 10), ]
    B[[1]]<-a 
    B[[2]]<-b 
    

    The above answers are similar, but I thought this was worth posting.

    0 讨论(0)
提交回复
热议问题