R
中的向量索引以1
开头而不是通常0
的原因是什么?
示例:
> arr<-c(10,20)
> arr[0]
numeric(0)
> arr[1]
[1] 10
> arr[2]
[1] 20
只是他们想要存储有关矢量的额外信息,并且除了作为矢量的第一个元素外,不知道存储它的位置?
答案 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
>