为什么这样有效:
ncota <- 1
nslope <- 29
resul <- matrix(rep(0,ncota*nslope*4),ncota*nslope,4)
Run Code Online (Sandbox Code Playgroud)
但这不是吗?
ncota <- 1
sini <- 0.1; sfin <- 1.5; spaso <- 0.05; nslope <- 1+((sfin-sini)/spaso)
resul <- matrix(rep(0,ncota*nslope*4),ncota*nslope,4)
Run Code Online (Sandbox Code Playgroud)
我想问题是该除法给出了一个非整数.如何让第二个工作?我需要创建一个零矩阵,其大小由方程计算计算得出.
干杯
如果你所要做的就是创建一个零矩阵,你不需要提供正确数量的零,只需提供一个零,让R将其循环到所需的长度:
matrix(0, ncota*nslope, 4)
Run Code Online (Sandbox Code Playgroud)
第二个失败的原因ncota * nslope * 4
是不完全是116:
> (ncota * nslope * 4) == 116
[1] FALSE
> all.equal(ncota * nslope * 4, 116)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
all.equal
如果允许浮点错误,则显示这些值相等.
?rep
包括以下内容:
Non-integer values of ‘times’ will be truncated towards zero. If
‘times’ is a computed quantity it is prudent to add a small fuzz.
Run Code Online (Sandbox Code Playgroud)
如果我们按照它说的那样做并添加一个小的模糊,rep
确实给出了所需的0数:
> length(rep(0, times = ncota*nslope*4 + 0.00000001))
[1] 116
Run Code Online (Sandbox Code Playgroud)
正如Hadley所述(在评论中),可以使用以下zapsmall
函数轻松添加此模糊:
> length(rep(0, times = zapsmall(ncota*nslope*4)))
[1] 116
Run Code Online (Sandbox Code Playgroud)