【问题标题】:Is everything a vector in R?一切都是R中的向量吗?
【发布时间】:2021-11-04 13:30:49
【问题描述】:

我曾在 Python 中使用 Pandas 对我收集的数据进行一些操作和回归并回答 SO 问题,并认为学习它的灵感可能有助于我的理解。

我正在使用 learn-R 教程,在 vector 和一些关于 SO 和网络的挖掘之后,我来到了这个:

# So assigning a value to v will create an atomic vector
# of length one with a type
v <- 1
is.vector(v)  # TRUE
class(v)  # 'numeric'
# But literals are also vectors? These all return TRUE
is.vector(1)
is.vector("string literal")
is.vector(TRUE)
is.vector("c")

# and lists are vectors too
l <- list(1, 2, 3)
is.vector(l)  # TRUE

那么R中的一切都是向量吗?

【问题讨论】:

  • R的基本数据结构包括:vectors、lists、data.frame和matrix
  • (@tushaR,我会概括“矩阵”:它只有 2 个维度,而 "array" 可以有任意数量的维度,但在其他方面完全兼容。identical(matrix(1:3, nrow=1), array(1:3, dim=c(1,3))) 是真的。)
  • R 没有标量数据类型。所有数据类型都是原子或通用向量(列表)。我建议阅读语言定义:cran.r-project.org/doc/manuals/r-release/…
  • R 中的一切都是对象。 is.vector(df)返回FALSE.
  • 函数不是向量。如果是,则闭包类型的对象可能是可子集的。 ;)

标签: r vector


【解决方案1】:

不,有些东西不是 R 中的向量,但是您想要存储数据的大多数方式都是向量。令人困惑的问题是is.vector() 有一个奇怪的定义:它不允许属性。例如,

x <- 1:3
is.vector(x)
#> [1] TRUE
attr(x, "foo") <- "bar"
x
#> [1] 1 2 3
#> attr(,"foo")
#> [1] "bar"
is.vector(x)
#> [1] FALSE

reprex package (v2.0.0) 于 2021-09-07 创建

我想说x 即使有属性仍然是一个向量,但是is.vector() 函数认为有属性的东西不是向量。举个荒谬的例子:根据is.vector(),因子不是向量,但您可以将它们视为:

x <- factor(letters[1:4])
is.vector(x)
#> [1] FALSE
x
#> [1] a b c d
#> Levels: a b c d
x[2:3]
#> [1] b c
#> Levels: a b c d

reprex package (v2.0.0) 于 2021-09-07 创建

因此,如果我们将向量定义为可以使用[][[]] 索引的对象,那么大多数数据类型(由逻辑、整数、数字、复杂、字符和原始以及列表构建的类型)都是向量。 R 中没有这些类型的标量。

另一方面,如果将向量定义为 is.vector() 为其返回 TRUE 的对象,则有许多不是向量的数据类型:因子、矩阵、数组、时间序列、data.frames、等等,所以不要那样做。 :-)

您使用文字的示例以这种方式工作,因为 R 不会以任何特殊方式处理文字值。它们只是给出对象的表达式。

有些东西真的不是向量:NULL 对象、语言对象如名称(例如 as.name("x"))、环境、函数等。

【讨论】:

    猜你喜欢
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多