【发布时间】:2021-03-26 12:24:52
【问题描述】:
为什么,在 R 中,是这样的:
a <- FALSE
a
#> [1] FALSE
但是
b <- c(FALSE, 1)
b
#> [1] 0 1
a 不是长度为 1 的向量吗?为什么长度为 2 的向量的行为会有所不同?
这是因为所有向量元素都必须属于同一类型吗?
由reprex package (v0.3.0) 于 2021-03-26 创建
【问题讨论】:
为什么,在 R 中,是这样的:
a <- FALSE
a
#> [1] FALSE
但是
b <- c(FALSE, 1)
b
#> [1] 0 1
a 不是长度为 1 的向量吗?为什么长度为 2 的向量的行为会有所不同?
这是因为所有向量元素都必须属于同一类型吗?
由reprex package (v0.3.0) 于 2021-03-26 创建
【问题讨论】:
是的,正如您所说,向量具有类型,并且向量的所有元素都被强制转换为可以包含尽可能多的原始信息的最具包容性的类型。
typeof(FALSE) # logical
typeof(c(FALSE, 1)) # double, i.e. double-precision numeric
typeof(c(FALSE, 1, 'a')) # character
要保持不同的类型,你需要一个列表:
b <- list(FALSE, 1)
这是可行的,因为列表的每个条目都有自己的类型。
为什么有不同的类型?与double(每个条目 64 位)相比,logical 可以使用更少的内存(每个条目一位)进行存储,并且在某些情况下也可以更快地处理。
【讨论】:
logical 类向量有 3 个可能的值 - TRUE、FALSE、NA。有超过 3 个整数 [需要引用],所以 integer 类需要能够包含更多信息,而双 numeric 类甚至比 integer 更多。