is.vector与as.vector
引入的几个问题
问题一
x <- c(a = 1, b = 2)
is.vector(x) ## TRUE
all.equal(x, as.vector(x)) ## FALSE
x本来就是vector, 输出也证实了这一点, 怎么说不相等呢?
问题二
x<-list(1,"abc")
is.vector(x) ## TRUE
x是list, 怎么is.vector返回为TRUE?
问题三
is.list(df)
! is.vector(df)
! is.vector(df, mode = "list")
is.vector(list(), mode = "list")
全部返回为TRUE
但df明明是list, 问题二中知道了is.vector(list)应该是true, 怎么这里又是得到F?
is.vector
文档
‘is.vector’ returns ‘TRUE’ if ‘x’ is a vector of the specified mode having no attributes other than names. It returns 'FALSE’ otherwise.
不仅得是vector, 还得符合mode, 还得没有names以外的属性.
问题是, specifide mode包括哪些? 如何理解no attributes other than names
?
先回答第二个问题
attributes
is.vector不能接受有除了names以外的非隐藏属性. 什么是隐藏属性? 当class没有显式时就是. dim不是隐藏属性.
来看看特殊的class:
> class(b)<-NULL
> attr(b,"class")
NULL
> class(b)
[1] "numeric"
class(b)<-"abc"
> attr(b,"class")
[1] "abc"
class明明是numeric, 但attr却说是NULL.
但如果赋值, attr就会给出了. 此时is.vector(b)也会是FALSE.
mode
mode有哪些选择?
mode: character string naming an atomic mode or ‘"list"’ or ‘"expression"’ or (except for ‘vector’) ‘"any"’. Currently, ‘is.vector()’ allows any type (see ‘typeof’) for ‘mode’, and when mode is not ‘"any"’, ‘is.vector(x, mode)’ is almost the same as ‘typeof(x) == mode’.
mode可以是atomic中的一种(The atomic modes are ‘"logical"’, ‘"integer"’, ‘"numeric"’ (synonym ‘"double"’), ‘"complex"’, ‘"character"’ and ‘"raw"’.), 可以是list, expression, any.
list和expression不用说, 但是any是什么?
mode="any"
is.vector(mode="any"), 那么对于atomic, list, expression都会返回TRUE
当然, 也还是不能有属性, 比如:
> a=c(1,2)
> class(a)<-c("abc","bce")
> is.vector(a,mode="any")
[1] FALSE
as.vector的效果
它的效果也要分情况讨论:
- atomic: 去除所有属性, 包括names
- list和expression: 没有作为
比如:
> x<-list(1,"abc")
> as.vector(x)
[[1]]
[1] 1
[[2]]
[1] "abc"
> all.equal(x, as.vector(x))
[1] TRUE
回答一开始的几个问题
问题一
x <- c(a = 1, b = 2)
is.vector(x) ## TRUE
all.equal(x, as.vector(x)) ## FALSE
x本来就是vector, 输出也证实了这一点, 怎么说不相等呢?
因为as.vector去除了names属性, 而x是有这个属性的.
问题二
x<-list(1,"abc")
is.vector(x) ## TRUE
x是list, 怎么is.vector返回为TRUE?
默认any, any对没有class的list是返回TRUE的.
问题三
is.list(df)
! is.vector(df)
! is.vector(df, mode = "list")
is.vector(list(), mode = "list")
全部返回为TRUE
但df明明是list, 问题二中知道了is.vector(list)应该是true, 怎么这里又是得到F?
因为df有class:
> class(df)
[1] "data.frame"
未解决的问题
is.automic
list的存储方式就是vector. 当人们想要判断是不是vector时, 他们想要的大概是看是不是atomic vector. 我觉得此时用is.atomic
就可以, 但是Advanced R又说, 它的行为也不是判断是不是atomic vector. 但是文档明明就说:
It is common to call the atomic types ‘atomic vectors’, but note that ‘is.vector’ imposes further restrictions: an object can be atomic but not a vector (in that sense).
但我没找到反例.
总结
is.vector并不能判断是不是atomatic vector, 主要判断的是attributes.
as.vector主要作用也是去除attributes, 包括names都会被去除.
factor比较复杂, 这里没有讨论.