Почему векторные индексы в 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 
>