Во-первых, я рекомендую прочитать этот вопрос и ответ о воспроизводимых примерах для написания ваших будущих вопросов.Например, я не знаю, какой пакет вы используете для функции distHaversine
, поэтому не могу быть уверен в ее аргументах.Чем проще вам будет ответить на ваш вопрос, тем больше вероятность, что вы получите нужный вам ответ.
В вашем цикле вызова for
есть пара ошибок:
- Вам нужно использовать число последовательность для циклического перебора, ни одно число
nrow()
не используется для двумерных массивов, таких как матрицы или кадры данных.Для вектора типа df3$value
вы должны использовать length()
.Предполагая, что df3
является объектом data.frame, вы можете легко проверить, что nrow(df3$value)
возвращает NULL.
Итак, ваша проблема более проста: вызов цикла for даже не выполняется.Вот почему ваш второй блок кода дает вам желаемый результат, а первый - нет.
for(i in 1:nrow(df3)) { }
# or
for(i in 1:length(df3$x)) { }
# or (maybe better)
for(i in seq_along(df3$value)) { }
Но, я думаю, вам следует избегать использования циклов for
при написании кода R.В этом нет ничего плохого, но вы должны злоупотреблять функциональным программированием R и векторизованными решениями для краткого и эффективного кода.
Например, вы можете написать функцию, основанную на втором коде, и объединить ее с lapply
функция или purrr семейство пакетов map
(в данном случае purrr::map_dfr()
).Я настоятельно рекомендую привыкнуть к последнему, так как он намного надежнее.