Подтвердить что ты не робот

Присвоение NULL элементу списка в R?

Я нашел эту ситуацию странной и хотел, чтобы более опытные пользователи делились своими мыслями и обходными решениями. При запуске примера кода ниже в 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]])
print(sampleList[[2]])
print(sampleList[[3]])
print(length(sampleList))
sampleList[[2]] <- NULL
print(length(sampleList))
print(sampleList[[2]])
print(sampleList[[3]])

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

Есть ли способ, которым я могу присвоить ему NULL и не видеть описанное выше поведение?

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

4b9b3361

Ответ 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

Ответ 2

Ваш вопрос немного сбивает с толку.

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

sampleList[[2]] <- NA

вместо NULL, но если "Я хочу проиграть" вы имеете в виду удалить его, то вы уже успели. Вот почему: "Элементы списка смещаются вверх".

Ответ 3

obj = list(x = "Some Value")
obj = c(obj,list(y=NULL)) #ADDING NEW VALUE
obj['x'] = list(NULL) #SETTING EXISTING VALUE
obj