2015-01-20 4 views
1
for(i in 1:100) 
{ 
    for(j in 1:100) 
    { 
     hdist <- rgeos::gDistance(xySpatialLines[[i]], xySpatialLines[[j]], byid=FALSE, hausdorff=TRUE) 
     distances[i,j] <- dist 
    } 
} 

Есть ли способ, чтобы упростить J цикл, чтобы получить что-то вроде этого:Как упростить FOR петли в R?

for(i in 1:100) 
{ 
    distances[i,j] <- lapply(???) # or sapply? 
} 

UPDATE:

Данные хранятся в xySpatialLines[[i]] - это SpatialLines объекты:

library(sp) 
xySpatialLines <- vector(mode = "list", length = 2) 
x1 <- c(1,4,5,3,2) 
y1 <- c(2,5,3,6,7) 
x2 <- c(4,4,6,3,2) 
y2 <- c(8,5,2,6,1) 
xy1 <- cbind(x1,y1) 
xy2 <- cbind(x2,y2) 
xy1.sp = sp::SpatialPoints(xy1) 
xy2.sp = sp::SpatialPoints(xy2) 
spl1 <- sp::SpatialLines(list(Lines(Line(xy1.sp), ID="a"))) 
spl2 <- sp::SpatialLines(list(Lines(Line(xy2.sp), ID="b"))) 
xySpatialLines[[1]] = spl1 
xySpatialLines[[2]] = spl2 
+0

Посмотрите на 'mapply' (многомерный' lapply'). И вы всегда можете использовать двойной 'lapply()' –

+0

@Richard Scriven: Моя идея состоит в том, чтобы преобразовать этот двойной цикл в foreach()% dopar% {# ... mapply} O вы бы предложили использовать double lapply? Я ищу эффективное вычислительное решение –

+0

@Richard Scriven: см. Обновление –

ответ

4

Вы можете использовать внешний:

distances = outer(xySpatialLines, xySpatialLines, FUN = gDistance, byid=FALSE, hausdorff = TRUE) 
+0

Вы имеете в виду, что эта единственная строка заменит мою полную двойную петлю? –

+0

Он должен. У меня нет данных из вашего вопроса для подтверждения. –

+0

Вы можете видеть, что делает 'external', если вы попробуете несколько простых примеров, например' external (c (1,2,3), c (4,5,6)), «+») или «внешний (c (1,2,3), c (4,5,6), функция (x, y) x^2 - y)» или «внешний (c (1, 2,3), c (4,5,6), функция (x, y) paste (x, "меньше, чем y, y)). – eipi10