Почему векторные индексы в R начинаются с 1, а не 0?
В чем причина того, что векторные индексы в R
начинаются с 1
вместо обычного 0
?
Пример:
> arr<-c(10,20)
> arr[0]
numeric(0)
> arr[1]
[1] 10
> arr[2]
[1] 20
Это просто, что они хотят хранить дополнительную информацию об векторе и не знали, где его хранить, кроме как в качестве первого элемента вектора?
Ответы
Ответ 1
FORTRAN - это один язык, который запускает массивы на 1. Математики имеют дело с векторами, которые всегда начинаются с компонента 1 и проходят через N. Соглашения линейной алгебры начинаются с строки и столбца с номером 1 и также проходят через N.
C началось с нуля из-за арифметики указателя, которая была скрыта под ней. Java, JavaScript, С++ и С# последовали примеру C.
Ответ 2
Векторы в математике часто представлены как n-кортежи, элементы которых индексируются от 1 до n. Я подозреваю, что r хотел остаться верным этим обозначениям.
Ответ 3
Фрэнк, я думаю, вы неправильно интерпретировали то, что видели, когда набрали arr [0]. Числовое значение (0) означает, что результатом является числовой вектор без элементов. Это не означает, что тип вектора "сохраняется" в элементе 0. Вы получили бы тот же результат, если бы вы набрали, например, arr [arr > 30]. Ни один элемент не удовлетворяет этому условию, поэтому вектор результата не имеет элементов. Аналогично, ни один элемент не имеет индекса 0. Это преднамеренно и не имеет ничего общего с пространством 0, используемым для чего-то другого.
Ответ 4
0 является только "обычным", потому что это то, что сделал C, и многие более поздние языки рабски скопировали синтаксис Си. По умолчанию в массивах Fortran 1-based.
В Ada нет значения по умолчанию, и вам нужно выбрать начальный и конечный диапазоны. Интересно, что большинство кодов, с которыми я столкнулся, выбирают "1" для нижней границы. Я думаю, что довольно хороший признак того, куда бы пошли люди, получили свободный выбор.
Ответ 5
R является "платформой для экспериментов и исследований". Его цель состоит в том, чтобы позволить "статистикам использовать все возможности такой среды" без переосмысления того, как они обычно относятся к статистике. Поэтому люди используют формулы для создания регрессионных моделей, и люди начинают рассчитывать на 1.
Ответ 6
На самом деле, я думаю, что C-подобная версия, начинающаяся с 0, очень логична, когда вы смотрите на то, как организована память.
В C мы можем написать следующее:
int* T = new int[10];
Первый элемент массива - * T. Это совершенно "логично", потому что * T - это адрес первого аргумента памяти. Второй элемент - это второй случай so * (T + 1): мы движемся вперед одним "sizeof (int)".
Чтобы сделать код более читаемым, C реализовал псевдоним: T [i] для * (T + i).
Чтобы получить доступ к первому элементу, вам нужно получить доступ к * T, который является T [0]. Это совершенно естественно.
Эта идея расширяется итераторами:
std::vector<int> T(10);
int val = *(T.begin()+3);
T [i] является просто псевдонимом для * (T.begin() + i).
В fortran/R мы обычно начинаем с 1 из-за математических проблем, но там, безусловно, других хороших вариантов (cf эта ссылка например).
Не забывайте, что fortran может легко использовать массив, который начинается с 0:
PROGRAM ZEROARRAY
REAL T(0:9)
T(0) = 3.14
END
Ответ 7
Ты делаешь это неправильно. Если вы хотите сохранить дополнительные атрибуты в объекте, используйте attr
:
> foo <- 1:20
> attr(foo, "created") <- Sys.time() # just as an example
> str(foo)
atomic [1:20] 1 2 3 4 5 6 7 8 9 10 ...
- attr(*, "created")= POSIXct[1:1], format: "2010-06-28 14:07:15" # our time
> summary(foo) # object works as usual
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 5.75 10.50 10.50 15.20 20.00
>