【问题标题】:When does is.vector() return true?is.vector() 什么时候返回 true?
【发布时间】:2014-10-28 13:53:24
【问题描述】:

我对 R 比较陌生。在阅读文档时,以下句子让我感到困惑。

is.vector() 不测试对象是否为向量。相反,仅当对象是除名称之外没有其他属性的向量时,它才返回 TRUE。

other thread 关于为什么 is.vector() 为列表返回 TRUE 可能是一个很好的参考。

is.vector() 什么时候返回 true?

【问题讨论】:

    标签: r


    【解决方案1】:

    is.vector() 不测试对象是否为向量。相反,它仅在对象是除名称之外没有其他属性的向量时才返回 TRUE

    引用的意思正是它所说的。 为什么它说的更微妙。

    所有 R 对象都与“属性”列表相关联,可通过 attributes()(对于整个列表)和 attr()(对于单个属性)查看。实际上,对象的类实际上只是泛型 (S3) 函数用来确定使用哪种方法的特殊属性。

    在大多数情况下,该属性往往是“安静的”,但在na.omit() 函数的输出中可见(尝试x <- c(1, NA); y <- na.omit(x); print(y) 看看它的外观)。这里,y 有一个属性na.action,它本身就是一个具有属性class 的对象。使用z <- attr(y, "na.action") 将该属性分配给一个单独的对象,然后使用attributes(z) 查看其属性,然后使用attr(z, "class")

    class 属性存在时,R 使用它来覆盖底层对象的类;在这种情况下,omit 类将覆盖内部 integer 类。试试attr(z, "class") <- NULL; class(z)。注意这和直接写class(z) <- NULL的结果是一样的。

    现在再次用z <- attr(y, "na.action") 分配z。试试is.vector(z)。然后再次使用NULL 删除它的类并再次尝试is.vector(z)。希望这应该清楚is.vector 检查的内容。 class 属性在方法分派中有特殊用途的事实无关紧要。事实上,你可以对y 做同样的事情:试试is.vector(y)is.vector(x[!is.na(x)])

    这个标准的原因是 R 中许多看起来或行为不像向量的对象在内部存储为向量。矩阵属于这一类。试试x <- matrix(1:4, 2); dput(x) 之类的东西。您会注意到x 在内部保存为vector 1:4,并带有一个特殊属性.Dim。该属性是隐藏且不可访问的;试试attr(x, ".Dim")

    所有这些都记录在 R 手册的某个地方(我第一次看到它的地方),但我不记得是哪个部分。

    【讨论】:

      【解决方案2】:

      不同数据类型的一些示例。

      x <- list(
        "integer vector"   = integer(),
        "numeric vector"   = numeric(),
        "character vector" = character(),
        "logical vector"   = logical(),
        "complex vector"   = complex(),
        "raw vector"       = raw(),
        list               = list(),
        expression         = expression(),
        factor             = factor(),
        pairlist           = pairlist(),
        "numeric matrix"   = matrix(1),
        "character matrix" = matrix("a"),
        data.frame         = data.frame(),
        formula            = y ~ x,
        "function"         = identity,
        call               = call("identity", 1),
        name               = as.name("a"),
        null               = NULL,
        environment        = new.env()
      )
      vapply(x, is.vector, logical(1))
      ##    integer vector   numeric vector character vector   logical vector 
      ##              TRUE             TRUE             TRUE             TRUE 
      ##    complex vector       raw vector             list       expression 
      ##              TRUE             TRUE             TRUE             TRUE 
      ##            factor         pairlist   numeric matrix character matrix 
      ##             FALSE            FALSE            FALSE            FALSE 
      ##        data.frame          formula         function             call 
      ##             FALSE            FALSE            FALSE            FALSE 
      ##              name             null      environment 
      ##             FALSE            FALSE            FALSE
      

      factorlist 的结果并不完全直观,因此请小心处理。通常你想要is.atomic 而不是is.vector

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-21
        • 1970-01-01
        • 2021-09-04
        • 2014-10-25
        • 2014-11-04
        相关资源
        最近更新 更多