为什么R中的矢量索引从1开始,而不是0?

时间:2010-06-28 19:02:37

标签: arrays r vector

R中的向量索引以1开头而不是通常0的原因是什么?

示例:

> arr<-c(10,20)
> arr[0]
numeric(0)
> arr[1]
[1] 10
> arr[2]
[1] 20

只是他们想要存储有关矢量的额外信息,并且除了作为矢量的第一个元素外,不知道存储它的位置?

7 个答案:

答案 0 :(得分:42)

FORTRAN是一种在1处开始数组的语言。数学家处理总是从组件1开始并经过N的向量。线性代数约定从行和列开始编号为1并且也经过N.

由于隐含在下面的指针算法,因此C从0开始。 Java,JavaScript,C ++和C#也适用于C。

答案 1 :(得分:16)

数学中的向量通常表示为n元组,其元素的索引从1到n。我怀疑r想要坚持这种符号。

答案 2 :(得分:9)

0只是“通常”,因为这就是C所做的,而且许多后来的语言盲目地复制了C语法。默认情况下,Fortran阵列是基于1的。

在Ada中没有默认值,您必须选择开始和结束范围。有趣的是,似乎我遇到的大多数代码都选择“1”作为下限。我认为这是一个非常好的迹象,表明人们可以自由选择的地方。

答案 3 :(得分:9)

弗兰克,我认为你在输入arr [0]时误解了你所看到的内容。数字(0)只表示结果是没有元素的数字向量。这并不意味着向量的类型被“存储”在元素0中。如果你输入了类型,你会得到相同的结果,例如,arr [arr&gt; 30。没有元素满足该条件,因此结果向量没有元素。同样,没有元素具有索引0.这是有意的,并且与用于其他内容的0空间无关。

答案 4 :(得分:4)

R是“实验和研究的平台”。其目的是在不重新考虑他们通常处理统计数据的方式的情况下启用"statisticians to use the full capabilities of such an environment"。因此人们使用公式来制作回归模型,人们从1开始计算。

答案 5 :(得分:3)

实际上,我认为当您查看内存的组织方式时,“以0开头”的C版本是非常合乎逻辑的。 在C中我们可以写下以下内容:

int* T = new int[10];

数组的第一个元素是* T.这是完全“逻辑”的,因为* T是指向的第一个内存案例的地址。第二个元素是第二种情况所以*(T + 1):我们向前移动一个“sizeof(int)”。

为了使代码更具可读性,C实现了别名:T [i] for *(T + i)。 要访问第一个元素,您必须访问* T,即T [0]。这很自然。

这个想法由迭代器扩展:

std::vector<int> T(10);
int val = *(T.begin()+3);

T [i]只是*(T.begin()+ i)的别名。

在fortran / R中,由于数学问题,我们通常以1开头,但肯定有其他好的选择(例如,参见this link)。 不要忘记fortran可以轻松使用以0开头的数组:

PROGRAM ZEROARRAY
REAL T(0:9)
T(0) = 3.14
END

答案 6 :(得分:0)

你做错了。如果要在对象中存储其他属性,请使用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 
>