Как определяется, использует ли префикс префикс - PullRequest
1 голос
/ 23 июня 2019

Меня интересует очень простое поведение функции print(), для которой я не смог найти объяснения.

Если я добавлю name() к своему вектору, я не получупрефикс ([1]).Минимальный пример:

x <- 1
names(x) <- "name"
print(x)

y<-2
print(y)

Вывод:

print(x)

имя

1

и

print(y)

[1] 2

Мне было интересно, если names() изменит класс или что-то подобное, добавив атрибут.Но typeof() и class() предоставляют одинаковое значение для x и y.Поэтому я думаю, что это функция print(), которая не дает префикс в качестве вывода при задании атрибута.Когда print() использует префикс [x], а когда нет?

1 Ответ

3 голосов
/ 23 июня 2019

В первом случае объект x является числовым вектором и не имеет атрибутов.Во втором - объект y также является числовым вектором, но имеет атрибут «names»:

x <- 1
attributes(x)
# NULL

y <- 1
names(y) <- "value"
attributes(y)
# $`names`
# [1] "value"

В обоих случаях метод print.default () используется для отображения значения объекта.Эта функция вызывает .Internal(print.default(x, digits, quote, na.print, print.gap, right, max, useSource, noOpt)).

Глядя на исходный код этой функции (например, здесь: https://github.com/wch/r-source/blob/trunk/src/main/print.c), мы можем видеть, что в зависимости от того, имеет ли вектор атрибуты или нет, выходные данные содержат индексыпервые элементы в каждой строке вывода или нет:

if((dims = getAttrib(s, R_DimSymbol)) != R_NilValue && length(dims) > 1) {
   ...
}
else { // no dim()
...
   sprintf(ptag, "[[%d]]", i+1);
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...