Ответ 1
Хороший вопрос.
Просмотрите R-FAQ:
В R, если x является списком, тогда x [i] < - NULL и x [[i]] < - NULL удаляют указанные элементы из x. Первый из них несовместим с S, где он не работает. (Обратите внимание, что вы можете установить элементы в NULL, используя x [i] < - list (NULL).)
рассмотрим следующий пример:
> 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:
Как отметил автор R Inferno, при работе с NULL могут быть более тонкие ситуации. Рассмотрим довольно общую структуру кода:
# x is some list(), now we want to process it.
> for (i in 1:n) x[[i]] <- some_function(...)
Теперь имейте в виду, что если some_function()
возвращает NULL
, возможно, вы не получите то, что хотите: некоторые элементы просто исчезнут. вы должны использовать функцию lapply
.
Взгляните на этот пример с игрушкой:
> 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