is.list 在 tibble 列上总是 returns 正确?

is.list always returns true on tibble columns?

所以,我有一个包含矢量和 list-columns 的小标题。

使用 dplyr 选择 list-columns 很容易:

select_if(tb, is.list)

但它与 !- 的否定不起作用 编辑,这确实 select_if(tb,function(x)!is.list(x))

所以我想我可以做类似的事情:

select(tb, which(!apply(tb,2,is.list))

此 returns 无列。因为显然(reprex 来了),tibble 列上的 is.list 始终 returns 为真,即使对于向量列 (?)。

df <- data.frame(A = runif(100))
tb <- tibble(A = runif(100))

is.list(df$A)
# FALSE
is.list(tb$A)
# FALSE
is.list(df[,1])
# FALSE
is.list(tb[,1])
# TRUE

任何人都可以阐明这里发生的事情吗?

因为 tibble 有默认的 drop 参数 FALSE 意味着当你只从 dataframe 中对一列进行子集化时,它 return 是一个数字向量,而当你从 tibble 中对一列进行子集化时,它 return 是一个one-column 小题大做。

检查他们的 类。

class(df[, 1])
#[1] "numeric"
class(tb[, 1])
#[1] "tbl_df"     "tbl"        "data.frame"

如果你在dataframe中添加drop = FALSE,它会return你返回一个dataframe。

class(df[, 1, drop = FALSE])
#[1] "data.frame"

dataframe/tibble 列仍然是一个列表。

is.list(tb[, 1])
#[1] TRUE
is.list(df[, 1, drop = FALSE])
#[1] TRUE

所以回答你的问题是的,is.list 总是 returns TRUE on tibble 除非你明确提到 drop = TRUE on one-column tibble。

is.list(tb[, 1, drop = TRUE])
#[1] FALSE