Назначение NULL элементу списка в R? - PullRequest
46 голосов
/ 30 октября 2011

Я нашел это поведение странным и хотел, чтобы более опытные пользователи поделились своими мыслями и обходными путями.При запуске приведенного ниже примера кода в R:

sampleList <- list()
d<- data.frame(x1 = letters[1:10], x2 = 1:10, stringsAsFactors = FALSE)
for(i in 1:nrow(d)) {
        sampleList[[i]] <- d$x1[i]
}

print(sampleList[[1]])
#[1] "a"
print(sampleList[[2]])
#[1] "b"
print(sampleList[[3]])
#[1] "c"
print(length(sampleList))
#[1] 10

sampleList[[2]] <- NULL
print(length(sampleList))
#[1] 9
print(sampleList[[2]])
#[1] "c"
print(sampleList[[3]])
#[1] "d"

Элементы списка сдвигаются вверх.Возможно, это как и ожидалось, но я пытаюсь реализовать функцию, в которой я объединяю два элемента списка и удаляю один.Я в основном хочу потерять этот индекс списка или иметь его как NULL.

Можно ли как-нибудь назначить ему значение NULL и не видеть вышеуказанное поведение?

Спасибо за ваши предложения.

Ответы [ 4 ]

59 голосов
/ 30 октября 2011

Хороший вопрос.

Ознакомьтесь с R-FAQ :

В R, если x - это список, то x [i] <-NULL и x [[i]] <- NULL удаляют указанные элементы из x.Первый из них несовместим с S, где он не используется.(Обратите внимание, что вы можете установить элементы в NULL, используя x [i] <- list (NULL).) </p>

рассмотрите следующий пример:

> 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

ОБНОВЛЕНИЕ:

Как прокомментировал автор 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
7 голосов
/ 30 октября 2011

Ваш вопрос меня немного смущает.

Присвоение нулевого значения существующему объекту существенно удаляет этот объект (это может быть очень удобно, например, если у вас есть фрейм данных и вы хотите удалить определенные столбцы). Это то, что вы сделали. Я не могу определить, что именно вы хотите, хотя. Вы можете попробовать

sampleList[[2]] <- NA

вместо NULL, но если под "Я хочу проиграть" вы имеете в виду удалить его, значит, вы уже добились успеха. Вот почему «элементы списка сдвигаются вверх».

3 голосов
/ 18 мая 2016
obj = list(x = "Some Value")
obj = c(obj,list(y=NULL)) #ADDING NEW VALUE
obj['x'] = list(NULL) #SETTING EXISTING VALUE
obj
1 голос
/ 30 октября 2018

Если вам нужно создать список значений NULL, которые позже вы можете заполнить значениями (например, кадры данных) здесь нет жалоб :

B <-vector("list", 2) 

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

Ответы вышепохоже, но я думал, что это стоит опубликовать.

...