Если все, что вам нужно сделать, это создать матрицу нулей, вам не нужно указывать правильное количество нулей, просто поставьте единицу и позвольте R переработать ее до необходимой длины:
matrix(0, ncota*nslope, 4)
Причина, по которой второй отказывает, заключается в том, что ncota * nslope * 4
не совсем 116:
> (ncota * nslope * 4) == 116
[1] FALSE
> all.equal(ncota * nslope * 4, 116)
[1] TRUE
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.
и если мы сделаем, как говорится, и добавим небольшой пух, rep
даст желаемое число 0:
> length(rep(0, times = ncota*nslope*4 + 0.00000001))
[1] 116
Как отметил Хэдли (в комментариях), этот фазз можно легко добавить с помощью функции zapsmall
:
> length(rep(0, times = zapsmall(ncota*nslope*4)))
[1] 116