为什么在 R 中没有为向量定义维度(向量是无维度的)的具体例子?

Concrete examples on why dimension is not defined for vectors (vectors are dimensionless) in R?

Here: 在 R 中,需要为向量定义维度,

米。 JORGENSEN(新西兰怀卡托大学统计系):
"Would it not make sense to have dim(A)=length(A) for all vectors?"

B.D。 RIPLEY(英国牛津大学应用统计系):
“不。一维数组和向量不是一回事。 存在细微差别,例如 names() 的含义(请参阅 ?names)。

一维数组和向量 print 偶尔会以相同的方式打印 导致混淆,但你也无法从打印输出中看出 A 类型为 integer 而不是 double.
......
我的问题:
(1) 我不仅看不出 names() 上的细微差别,而且看不出
上的细微差别 (2) 我无法举出一个具体的例子来说明“从打印输出中得知 A 有类型 integer 而不是 double 问题。

任何有助于澄清 JORGENSEN-RIPLEY 讨论(使用 R 中的具体示例)的帮助将不胜感激。

为了解决第一个问题,让我们首先创建一个向量和一个一维数组:

(vector <- 1:10)
#>  [1]  1  2  3  4  5  6  7  8  9 10

(arr_1d <- array(1:10, dim = 10))
#>  [1]  1  2  3  4  5  6  7  8  9 10

如果我们给对象起一些名字,我们可以看出区别 里普利通过查看属性来暗示:

names(vector) <- letters[1:10]
names(arr_1d) <- letters[1:10]

attributes(vector)
#> $names
#>  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
attributes(arr_1d)
#> $dim
#> [1] 10
#> 
#> $dimnames
#> $dimnames[[1]]
#>  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

也就是说,一维数组实际上没有 names 属性, 而是 dimnames 属性(这是一个列表,而不是向量), names() 实际访问的第一个元素。

?names 中的 "Note" 部分对此进行了介绍:

For vectors, the names are one of the attributes with restrictions on the possible values. For pairlists, the names are the tags and converted to and from a character vector.

For a one-dimensional array the names attribute really is dimnames[[1]].

这里我们也看到缺少一个dim 向量的属性。 ( 也涵盖了数组和向量之间的差异。)

附加属性及其存储方式意味着 一维数组总是比它们的等效向量占用更多的内存:

# devtools::install_github("r-lib/lobstr")
lobstr::obj_size(vector)
#> 848 B
lobstr::obj_size(arr_1d)
#> 1,056 B

然而,这是我能想到的唯一原因 会想要有单独的向量类型和一维数组。我想这确实是 Jorgensen 提出的问题 问,即 为什么 有一个单独的 vector 类型而没有 dim 根本没有属性;我认为里普利并没有真正解决这个问题。 我很想听听其他理由。

至于第 2 点),当你用 : 创建一个向量时 总是一个整数:

vector <- 1:10
typeof(vector)
#> [1] "integer"

具有相同值的 double 将打印相同的内容:

double <- as.numeric(vector)
typeof(double)
#> [1] "double"

double
#>  [1]  1  2  3  4  5  6  7  8  9 10

但是整数和双精度不是一回事:

identical(vector, double)
#> [1] FALSE

R 中整数和双精度之间的区别很微妙,主要 一个是整数在内存中占用的空间较少 space。

lobstr::obj_size(vector)
#> 88 B
lobstr::obj_size(double)
#> 168 B

有关整数和双精度之间差异的更全面概述,请参阅 this answer

reprex package (v0.2.0.9000) 创建于 2018-07-09。