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&nbsp;a la vez, y golpearon<- list(NULL)&nbsp;como la solución (ya que usando<- NULL&nbsp;dará lugar a un error).

A data.frame es&nbsp;un tipo especial delist, por lo que no sería demasiado difícil imaginar que los enfoques para eliminar elementos de unlist&nbsp;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&nbsp;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&nbsp;¿valor? ¿O dependemos de la prueba y error para esto?