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

时间:2014-10-28 13:53:25

标签: r

我对R.相对较新。在阅读文档时,以下句子让我感到困惑。

  

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

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

is.vector()何时返回true?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

  

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

报价的含义正是它所说的。 为什么它说的更加微妙。

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

这个属性往往是安静的&#34;在大多数情况下,但使用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在内部保存为向量 1:4,并带有特殊属性.Dim。此属性隐藏且无法访问;试试attr(x, ".Dim")

这一切都记录在R手册的某处(这是我第一次看到的地方),但我不记得是哪一节。