Here :在 R 中,需要定义向量的维度,
M。 JORGENSEN(新西兰怀卡托大学统计系):
“对于所有向量来说,dim(A)=length(A)
没有意义吗?”
B.D. RIPLEY(英国牛津应用统计系):
“不。一维数组和向量不是同一件事。
存在细微的差异,例如 names()
的含义(请参阅 ?names
)。
一维数组和向量有时会以相同的方式打印
会导致困惑,但是您也无法从打印输出中看出 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
如果我们给这些对象一些名称,我们就可以看到区别 Ripley 通过查看属性来暗示:
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
的“注释”部分中有介绍:
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
向量的属性。 ( A related SO answer 也涵盖了数组和向量之间的差异。)
附加属性及其存储方法意味着 一维数组总是比它们的向量占用更多的内存:
# devtools::install_github("r-lib/lobstr")
lobstr::obj_size(vector)
#> 848 B
lobstr::obj_size(arr_1d)
#> 1,056 B
然而,这就是我能想到的唯一原因
希望向量和一维数组有不同的类型。我认为这确实是乔根森提出的问题
询问,即为什么有一个没有dim
的单独的vector
类型
完全没有属性;我认为里普利并没有真正解决这个问题。
我很想听听其他理由。
至于第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
但是整数和 double 不是一回事:
identical(vector, double)
#> [1] FALSE
R 中整数和 double 之间的差异很微妙,主要是 一是整数占用的内存空间更少。
lobstr::obj_size(vector)
#> 88 B
lobstr::obj_size(double)
#> 168 B
参见this answer更全面地了解整数和 double 之间的差异。
由 reprex package 创建于 2018-07-09 (v0.2.0.9000)。
关于r - 具体例子说明为什么R中没有为向量定义维度(向量是无量纲的)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51245534/