【发布时间】:2013-10-21 17:40:37
【问题描述】:
如何测试对象是否为向量,即模式logical、numeric、complex 或character? is.vector 的问题在于它还为列表和其他类型返回 TRUE:
> is.vector(list())
[1] TRUE
我想知道它是否是原始类型的向量。是否有本机方法,还是我必须通过存储模式?
【问题讨论】:
如何测试对象是否为向量,即模式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.recursive( list() ) 表示原子性?
%in% "numeric",因为它们的模式是“整数”。需要SimonO101的测试。
identical(NULL, pairlist())
也许不是最佳的,但它会做的工作:检查变量是否是一个向量,如果它不是一个列表。然后你将绕过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")
这将阻止匹配列表以及因子和矩阵。请注意整数的显式列表,因为作为一个类它不会与数字匹配。如果您需要更频繁地使用它,只需将其包装在一个小函数中即可。
【讨论】: