Когда is.vector() возвращает true?

Я относительно новичок в R. При чтении документов следующее предложение меня смущает.

is.vector() не проверяет, является ли объект вектором. Вместо этого он возвращает TRUE только в том случае, если объект является вектором без атрибутов, кроме имен.

Другой вопрос о том, почему is.vector() возвращает TRUE для списка, может быть хорошей ссылкой.

Когда is.vector() возвращает true?

2 ответа

<code>is.vector()</code> не проверяет, является ли объект вектором. Вместо этого он возвращает <code>TRUE</code> только в том случае, если объект является вектором без атрибутов, кроме имен.

Цитата означает именно то, что она говорит. Почему он говорит, что он говорит, более тонкий.

Все объекты R связаны со списком "атрибутов", которые можно просмотреть с помощью attributes() (для всего списка) с помощью attr() (для отдельных атрибутов). На самом деле, класс объекта - это просто специальный атрибут, который используют общие функции (S3) для определения того, какой метод использовать.

Это свойство имеет тенденцию быть "тихим" в большинстве случаев, но видно с выходом функции na.omit() (попробуйте x <- c(1, NA); y <- na.omit(x); print(y) чтобы увидеть, как это может выглядеть). Здесь y имеет один атрибут, na.action, который сам является объектом с атрибутом, class. Назначьте этот атрибут отдельному объекту с z <- attr(y, "na.action" ) и посмотрите на его атрибуты с attributes(z) а затем attr(z, "class").

Когда атрибут class существует, R использует его для перезаписывания класса базового объекта; в этом случае omit класс перекрывает внутренний integer класс. Попробуйте attr(z, "class") <- NULL; class(z) attr(z, "class") <- NULL; class(z). Обратите внимание, что это тот же результат, что и прямое написание class(z) <- NULL.

Теперь снова назначим z с z <- attr(y, "na.action" ). Попробуйте is.vector(z). Затем снова удалите его класс с помощью NULL снова попробуйте is.vector(z). Надеюсь, это должно дать понять, что is.vector проверка. Тот факт, что атрибут class имеет особое значение при отправке метода, не имеет значения. Фактически, вы можете сделать то же самое для y: try is.vector(y), is.vector(x[!is.na(x)]).

Причиной этого критерия является то, что многие объекты в R, которые не выглядят или действуют как векторы, хранятся внутри как векторы. Матрицы входят в эту категорию. Попробуйте что-то вроде x <- matrix(1:4, 2); dput(x) x <- matrix(1:4, 2); dput(x). Вы заметите, что x сохраняется внутри, как вектор 1:4, со специальным атрибутом .Dim. Этот атрибут скрыт и недоступен; попробуйте attr(x, ".Dim").

Это все описано где-то в руководстве R (где я впервые увидел его), но я не помню, в каком разделе.


Некоторые примеры для разных типов данных.

x <- list( "integer vector" = integer(), "numeric vector" = numeric(), "character vector" = character(), "logical vector" = logical(), "complex vector" = complex(), "raw vector" = raw(), list = list(), expression = expression(), factor = factor(), pairlist = pairlist(), "numeric matrix" = matrix(1), "character matrix" = matrix("a"), data.frame = data.frame(), formula = y ~ x, "function" = identity, call = call("identity", 1), name = as.name("a"), null = NULL, environment = new.env()
)
vapply(x, is.vector, logical(1))
## integer vector numeric vector character vector logical vector
## TRUE TRUE TRUE TRUE
## complex vector raw vector list expression
## TRUE TRUE TRUE TRUE
## factor pairlist numeric matrix character matrix
## FALSE FALSE FALSE FALSE
## data.frame formula function call
## FALSE FALSE FALSE FALSE
## name null environment
## FALSE FALSE FALSE

Результаты для factor и list не являются полностью интуитивными, поэтому будьте осторожны с ними. Часто вы хотите is.atomic а не is.vector.

licensed under cc by-sa 3.0 with attribution.