Поведение <- NULL в списках по сравнению с data.frames для удаления данных

Многие пользователи 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

Основные вопросы, которые у меня есть, еслиdata.frame этоlistпочему он ведет себя так по-другому в этом сценарии? Существует ли надежный способ узнать, когда элемент будет отброшен, когда он выдаст ошибку, и когда ему просто дадутNULL стоимость? Или мы зависим от проб и ошибок для этого?

Ответы на вопрос(1)

Ваш ответ на вопрос