为什么在 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。
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。