Zachowanie <- NULL na listach a data.frames do usuwania danych

Wielu użytkowników R w końcu odkrywa wiele sposobów usunięcia elementów ze swoich danych. Jednym ze sposobów jest użycieNULL, szczególnie gdy chcesz zrobić coś takiego, jak upuścić kolumnę z adata.frame lub upuść element zlist.

Ostatecznie użytkownik natrafia na sytuację, w której chce upuścić kilka kolumn zdata.frame od razu, i uderzyli<- list(NULL) jako rozwiązanie (od czasu użycia<- NULL spowoduje błąd).

A data.frame jest specjalny typlist, więc trudno byłoby sobie wyobrazić, że metody usuwania elementów zlist powinien być taki sam jak usuwanie kolumn zdata.frame. Jednak dają one różne wyniki, jak widać w poniższym przykładzie.

## 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

Przełącz się na zastosowanie tej samej koncepcji dolisti porównaj różnicę w zachowaniu.

## 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

Główne pytania, jakie mam, są następującedata.frame jestlist, dlaczego w tym scenariuszu zachowuje się tak inaczej? Czy istnieje niezawodny sposób poznania, kiedy element zostanie upuszczony, kiedy spowoduje błąd, a kiedy po prostu otrzymaNULL wartość? A może zależy nam na próbie i błędzie?

questionAnswers(1)

yourAnswerToTheQuestion