Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Как правило, в R лучше найти функции, которые выполняют циклы для вас, так как большинство из них настроены для этого. В этом случае вы можете попробовать использовать mutate
и lead
из пакета dplyr
:
library(dplyr)
df <- dplyr::tibble(lat = 1:5, lon = 5:1)
df
# A tibble: 5 x 3
# lat lon distance
# <int> <int> <dbl>
# 1 1 5 1.41
# 2 2 4 1.41
# 3 3 3 1.41
# 4 4 2 1.41
# 5 5 1 NA
df %>% mutate(distance = ComputeDistance(lat, lead(lat), lon, lead(lon)))
# A tibble: 5 x 3
# lat lon distance
# <int> <int> <dbl>
# 1 1 10 1.41
# 2 2 9 1.41
# 3 3 8 1.41
# 4 4 7 NA
Если вы действительно хотите придерживаться циклов for
, вам нужен только один для этой задачи , Вы были правы, говоря, что вы проходите через каждую комбинацию. Одной из альтернатив может быть:
for (i in 1:37) {
output <- ComputeDistance(DistTest[i, 5], DistTest[i + 1, 5],
DistTest[i, 6], DistTest[i + 1, 6])
Name <- 1658
testid <- rbind(testid, Name)
testdistance <- rbind(testdistance, output)
}
Одна из причин, по которой следует избегать этой конструкции, заключается в том, что вы постепенно увеличиваете объект (подробнее об этом см. здесь ).