许多 R 用户最终想出了很多方法来从他们的数据中删除元素。一种方法是使用NULL
,尤其是当您想做一些事情时,例如从 a 中删除一列data.frame
或从 a 中删除一个元素list
。
最终,用户遇到了一种情况,他们想data.frame
一次从 a 中删除几列,并且他们将其<- list(NULL)
作为解决方案(因为使用<- NULL
会导致错误)。
Adata.frame
是的一种特殊类型list
,因此不难想象从 a 中删除项目的方法list
应该与从 a 中删除列相同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
切换到将相同的概念应用于 a 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
我的主要问题是,如果 adata.frame
是 a list
,为什么在这种情况下它的行为如此不同?是否有一种万无一失的方法可以知道何时删除一个元素,何时会产生错误以及何时会简单地给它一个NULL
值?或者我们是否依赖于反复试验?