【问题标题】:How to test if object is a vector如何测试对象是否为向量
【发布时间】:2013-10-21 17:40:37
【问题描述】:

如何测试对象是否为向量,即模式logicalnumericcomplexcharacteris.vector 的问题在于它还为列表和其他类型返回 TRUE

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

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

【问题讨论】:

    标签: r object vector


    【解决方案1】:

    只有原始函数,所以我假设您想知道向量是否是原子类型之一。如果您想知道一个对象是否是原子的,请使用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.atomic() 也为矩阵返回 TRUE 后再次来到这里。这是意料之中的,但我一直在忘记一些事情......
    【解决方案2】:

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

    if(is.vector(someVector) & !is.list(someVector)) { 
      do something with the vector 
    }
    

    【讨论】:

    • 这个技巧可以帮助你解决 R 的 is.vector 函数对于向量和列表总是返回 TRUE 的事实。你必须问它两个问题,它是一个向量,它不是一个列表。虽然这些错误得到修复后,这种行为可能会在 R 的未来版本中发生变化。
    • @Jason 那是因为 c(list(), list()) 不返回原子向量而是返回一个列表。 c() 不创建向量,它组合元素。
    • 谢谢@JorisMeys。 R 的另一个“啊哈”时刻。删除我的评论,因为它具有误导性。
    【解决方案3】:

    要检查对象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
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-07-27
        • 2019-03-22
        • 1970-01-01
        • 2011-02-24
        • 1970-01-01
        • 2019-07-27
        • 1970-01-01
        • 2014-12-24
        • 1970-01-01
        相关资源
        最近更新 更多