web-dev-qa-db-fra.com

Assigner NULL à un élément de la liste dans R?

J'ai trouvé ce comportement étrange et je voulais que les utilisateurs plus expérimentés partagent leurs réflexions et leurs solutions de contournement .

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"

Les éléments de la liste sont déplacés vers le haut. C'est peut-être comme prévu, mais j'essaie d'implémenter une fonction dans laquelle je fusionne deux éléments d'une liste et en supprime un. Je veux fondamentalement perdre cet index de liste ou l'avoir comme NULL. 

Est-il possible de lui affecter une valeur NULL sans voir le comportement ci-dessus?

Merci pour vos suggestions.

43
harshsinghal

Bonne question.

Découvrez la R-FAQ :

Dans R, si x est une liste, alors x [i] <- NULL et x [[i]] <- NULL suppriment les éléments spécifiés de x. Le premier d'entre eux est incompatible avec S, où il s'agit d'un no-op. (Notez que vous pouvez définir des éléments sur NULL en utilisant x [i] <- list (NULL).)

considérons l'exemple suivant:

> 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

METTRE À JOUR:

En tant qu'auteur de the R Inferno a commenté, il peut y avoir des situations plus subtiles lorsqu'il s'agit de NULL. Considérez la structure générale du code:

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

Sachez maintenant que si some_function() renvoie NULL, vous n'obtiendrez peut-être pas ce que vous voulez: certains éléments ne feront que disparaître vous devriez plutôt utiliser la fonction lapply . Regardez cet exemple de jouet:

> 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
56
Max

Votre question me laisse un peu perplexe. 

L'attribution de la valeur null à un objet existant supprime essentiellement cet objet (ceci peut être très pratique, par exemple si vous avez un cadre de données et souhaitez supprimer des colonnes spécifiques). C'est ce que tu as fait. Je suis incapable de déterminer ce que vous voulez bien. Tu pourrais essayer 

sampleList[[2]] <- NA

au lieu de NULL, mais si par "je veux perdre" vous voulez dire le supprimer, alors vous avez déjà réussi. C'est pourquoi "les éléments de la liste sont décalés".

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

Si vous avez besoin de créer une liste de valeurs NULL que vous pourrez renseigner ultérieurement avec des valeurs (images, par exemple) here is no grief :

B <-vector("list", 2) 

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

Les réponses ci-dessus sont similaires, mais j’ai pensé que cela valait la peine d’être publié.

0
calycolor