【发布时间】:2014-10-28 13:53:24
【问题描述】:
我对 R 比较陌生。在阅读文档时,以下句子让我感到困惑。
is.vector() 不测试对象是否为向量。相反,仅当对象是除名称之外没有其他属性的向量时,它才返回 TRUE。
other thread 关于为什么 is.vector() 为列表返回 TRUE 可能是一个很好的参考。
is.vector() 什么时候返回 true?
【问题讨论】:
标签: r
我对 R 比较陌生。在阅读文档时,以下句子让我感到困惑。
is.vector() 不测试对象是否为向量。相反,仅当对象是除名称之外没有其他属性的向量时,它才返回 TRUE。
other thread 关于为什么 is.vector() 为列表返回 TRUE 可能是一个很好的参考。
is.vector() 什么时候返回 true?
【问题讨论】:
标签: r
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 手册的某个地方(我第一次看到它的地方),但我不记得是哪个部分。
【讨论】:
不同数据类型的一些示例。
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。
【讨论】: