зациклиться на последовательности и задаче округления в R

Я хочу присвоить некоторое значение вектору, например:

a = rep(0, 101)
for(i in seq(0, 1, 0.01)){
    u <- 100 * i + 1
    a[u] <- u
}
a
plot(a)

Выход

> a
  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  30   0  31  32  33  34
 [35]  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  59   0  60  61  62  63  64  65  66  67  68
 [69]  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 101

Есть проблемы на 29-м и 59-м элементах. Они должны быть 29 и 59, а получается 0, значение по умолчанию. И предыдущие значения, 28-е и 58-е, тоже неверны. Почему это происходит? Благодарю вас!


person Carlton Chen    schedule 05.12.2018    source источник
comment
если вы попробуете u <- 1000 * i / 10 + 1 проблема будет решена, это серьезная ошибка округления?   -  person Carlton Chen    schedule 05.12.2018
comment
Если вы сделаете as.integer(c(0.29*100+1,0.029*1000+1,0.0029*10000+1,0.00029*100000+1)), он вернет либо 29, либо 30 в зависимости от случая, но as.integer(round(c(0.29*100+1,0.029*1000+1,0.0029*10000+1,0.00029*100000+1))) всегда вернет 30. Похоже, это проблема, связанная с целочисленным преобразованием, которое возвращает неточное число. Большего сказать не могу, к сожалению..   -  person Lamia    schedule 05.12.2018
comment
Взгляните на эти вопросы .com/questions/11128741/ stackoverflow.com/questions/13204699/   -  person Lamia    schedule 05.12.2018
comment
Спасибо @Ламия. У меня нет опыта в области компьютерных наук, но почему такая запутанная проблема до сих пор не определена и не решена? Я думаю, в языках программирования не должно быть абсолютно никакой двусмысленности?   -  person Carlton Chen    schedule 05.12.2018
comment
Если вы хотите узнать больше, посмотрите арифметику с плавающей запятой и точность. Кроме того, взгляните на круг один в этом классном описании распространенных проблем и ловушек в R burns-stat.com/pages/Tutor/R_inferno.pdf.   -  person Lamia    schedule 06.12.2018


Ответы (1)


У вас проблема с индексацией. Я не знаю, как объяснить, почему это не работает так, как написано, но вот модификация вашего кода, которая работает:

a = rep(0, 101)
s<-seq(0, 1, 0.01)
for(i in 1:101){
  a[i] <- 100 * s[i] + 1 
}
a
plot(a)

Как правило, лучше избегать использования нескольких индексов в одном цикле, так как это может привести к путанице и затруднениям при диагностике проблем.

person KamRa    schedule 05.12.2018
comment
Благодарю вас! Но не могли бы вы дать мне подсказку или ключевые слова о проблеме, я могу узнать это сам. - person Carlton Chen; 05.12.2018
comment
Чтобы уточнить (связанный с комментарием Ламии), это, вероятно, связано с типами данных. Индексацию следует выполнять с целочисленным типом данных, поскольку он однозначен. Вы используете «двойник», который является типом данных с плавающей запятой в R. Возможно, тип данных с плавающей запятой вызывает ошибку при индексировании. См. этот вопрос для примера некоторых проблем с неточностью с плавающей запятой: .com/questions/2100490/ - person KamRa; 06.12.2018