Comportamiento de <- NULL en listas frente a datos. Marcos para eliminar datos

Muchos usuarios de R finalmente descubren muchas formas de eliminar elementos de sus datos. Una forma es usarNULL, particularmente cuando quieres hacer algo como eliminar una columna de undata.frame o soltar un elemento de unlist.

Finalmente, un usuario se encuentra con una situación en la que desea eliminar varias columnas de undata.frame a la vez, y golpearon<- list(NULL) como la solución (ya que usando<- NULL dará lugar a un error).

A data.frame es un tipo especial delist, por lo que no sería demasiado difícil imaginar que los enfoques para eliminar elementos de unlist debería ser lo mismo que eliminar columnas de unadata.frame. Sin embargo, producen resultados diferentes, como se puede ver en el siguiente ejemplo.

## Make some small data--two data.frames and two lists
cars1 <- cars2 <- head(mtcars)[1:4]
cars3 <- cars4 <- as.list(cars2)

## Demonstration that the `list(NULL)` approach works
cars1[c("mpg", "cyl")] <- list(NULL)
cars1
#                   disp  hp
# Mazda RX4          160 110
# Mazda RX4 Wag      160 110
# Datsun 710         108  93
# Hornet 4 Drive     258 110
# Hornet Sportabout  360 175
# Valiant            225 105

## Demonstration that simply using `NULL` does not work
cars2[c("mpg", "cyl")] <- NULL
# Error in `[<-.data.frame`(`*tmp*`, c("mpg", "cyl"), value = NULL) : 
#   replacement has 0 items, need 12

Cambiar a aplicar el mismo concepto a unlist, y comparar la diferencia de comportamiento.

## Does not fully drop the items, but sets them to `NULL`
cars3[c("mpg", "cyl")] <- list(NULL)
# $mpg
# NULL
# 
# $cyl
# NULL
# 
# $disp
# [1] 160 160 108 258 360 225
# 
# $hp
# [1] 110 110  93 110 175 105

## *Does* drop the `list` items while this would
##   have produced an error with a `data.frame`
cars4[c("mpg", "cyl")] <- NULL
# $disp
# [1] 160 160 108 258 360 225
# 
# $hp
# [1] 110 110  93 110 175 105

Las principales preguntas que tengo son, si undata.frame es unlist, ¿por qué se comporta de manera tan diferente en este escenario? ¿Existe una manera infalible de saber cuándo se eliminará un elemento, cuándo producirá un error y cuándo simplemente se le dará unaNULL ¿valor? ¿O dependemos de la prueba y error para esto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta