Многие пользователи R в конечном итоге определяют множество способов удаления элементов из своих данных. Один из способов - использовать NULL
, особенно если вы хотите сделать что-то вроде сброса столбца из data.frame
или удалить элемент из list
.
В конце концов, пользователь сталкивается с ситуацией, когда они хотят удалить сразу несколько столбцов из data.frame
, и они попадают в <- list(NULL)
в качестве решения (поскольку использование <- NULL
приведет к ошибке).
A data.frame
- особый тип list
, поэтому было бы не слишком сложно представить, что подходы к удалению элементов из list
должны быть такими же, как удаление столбцов из data.frame
. Однако они дают разные результаты, как видно из приведенного ниже примера.
## 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
Переключитесь на применение той же концепции до list
и сравните разницу в поведении.
## 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
Основные вопросы, которые у меня есть, если a data.frame
является list
, почему в этом случае он ведет себя по-другому? Есть ли надежный способ узнать, когда элемент будет удален, когда он выдает ошибку, и когда ему будет просто присваивается значение NULL
? Или мы зависим от проб и ошибок для этого?