29

如何测试一个对象是否是一个向量,即mode logical、或?问题在于它还返回列表和其他类型:numericcomplexcharacteris.vectorTRUE

> is.vector(list())
[1] TRUE

我想知道它是否是原始类型的向量。是否有本机方法,还是我必须通过存储模式?

4

4 回答 4

32

只有原始函数,所以我假设您想知道向量是否是原子类型之一。如果您想知道一个对象是否是原子的,请使用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")
于 2013-10-21T17:46:22.743 回答
8

也许不是最佳的,但它会做的工作:检查变量是否是一个向量,如果它不是一个列表。然后你将绕过is.vector结果:

if(is.vector(someVector) & !is.list(someVector)) { 
  do something with the vector 
}
于 2016-02-06T11:45:50.193 回答
1

要检查一个对象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
于 2021-08-31T00:07:40.967 回答
0

使用的替代方法mode是使用class

class(foo) %in% c("character", "complex", "integer", "logical", "numeric")

这将阻止匹配列表以及因子和矩阵。请注意整数的显式列表,因为作为一个类它不会与数字匹配。如果您需要更频繁地使用它,只需将其包装在一个小函数中即可。

于 2020-03-30T22:12:50.863 回答