Как проверить, является ли объект вектором

Как проверить, является ли объект вектором, то есть mode logical, numeric, complex или character? Проблема с is.vector заключается в том, что она также возвращает TRUE для списков и, возможно, других типов:

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

Я хочу знать, является ли он вектором примитивных типов. Есть ли собственный метод для этого, или мне нужно идти в режиме хранения?

Ответ 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")

Ответ 2

Возможно, не оптимальный, но он будет работать: проверьте, является ли переменная вектором И если это не список. Затем вы обходите результат is.vector:

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