如何测试一个对象是否是一个向量,即mode logical
、或?问题在于它还返回列表和其他类型:numeric
complex
character
is.vector
TRUE
> is.vector(list())
[1] TRUE
我想知道它是否是原始类型的向量。是否有本机方法,还是我必须通过存储模式?
只有原始函数,所以我假设您想知道向量是否是原子类型之一。如果您想知道一个对象是否是原子的,请使用is.atomic
.
is.atomic(logical())
is.atomic(integer())
is.atomic(numeric())
is.atomic(complex())
is.atomic(character())
is.atomic(raw())
is.atomic(NULL)
is.atomic(list()) # is.vector==TRUE
is.atomic(expression()) # is.vector==TRUE
is.atomic(pairlist()) # potential "gotcha": pairlist() returns NULL
is.atomic(pairlist(1)) # is.vector==FALSE
如果您只对您提到的原子类型的子集感兴趣,最好明确地测试它们:
mode(foo) %in% c("logical","numeric","complex","character")
也许不是最佳的,但它会做的工作:检查变量是否是一个向量,如果它不是一个列表。然后你将绕过is.vector
结果:
if(is.vector(someVector) & !is.list(someVector)) {
do something with the vector
}
要检查一个对象obj
是一个向量,而不是一个列表或矩阵,请考虑:
is.vector(obj) && is.atomic(obj)
仅对列表使用is.vector(obj)
返回值TRUE
,而不对矩阵使用;并is.atomic(obj)
返回TRUE
矩阵但不返回列表。以下是一些样本检查:
mymatrix <- matrix()
mylist <- list()
myvec <- c("a", "b", "c")
is.vector(mymatrix) && is.atomic(mymatrix) # FALSE
is.vector(mylist) && is.atomic(mylist) # FALSE
is.vector(myvec) && is.atomic(myvec) # TRUE
使用的替代方法mode
是使用class
:
class(foo) %in% c("character", "complex", "integer", "logical", "numeric")
这将阻止匹配列表以及因子和矩阵。请注意整数的显式列表,因为作为一个类它不会与数字匹配。如果您需要更频繁地使用它,只需将其包装在一个小函数中即可。