我对R.相对较新。在阅读文档时,以下句子让我感到困惑。
is.vector()不测试对象是否为向量。相反,只有当对象是一个除名称之外没有属性的向量时,它才返回TRUE。
other thread关于为什么is.vector()为列表返回TRUE可能是一个很好的参考。
is.vector()
何时返回true?
答案 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
factor
和list
的结果并不完全直观,所以要小心。通常您需要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手册的某处(这是我第一次看到的地方),但我不记得是哪一节。