Изчертаване на линии без for цикли в R

Правя диаграми на потока за модели на пространствено взаимодействие, с координати x-y както за произхода, така и за дестинациите:

потоци

Проблемът е, че продължавам да използвам вложени цикли for (един за произход, един за дестинации), за да начертая тези редове и съм сигурен, че има по-добър начин в R.

Както и да е, за да отговоря на този въпрос, създадох прост възпроизводим пример с 4 източника и 2 дестинации. Подозирам, че отговорът за по-бързото чертане е в алгебрата на матрицата, но не съм сигурен откъде да започна. Тествайте го и моля да ме уведомите:

o <- data.frame(x = c(3,5,6,1), y = c(8,2,3,2))
plot(o)
d <- data.frame(x = c(5,3), y = c(5,3))
points(d, col="red", pch=3)
beta <- 0.6

dist <- matrix(sqrt(c(o[,1] - d[1,1], o[,1] - d[2,1] )^2 +
               c(o[,2] - d[1,2], o[,2] - d[2,2] )^2), ncol = 2)
s <- dist

for(i in 1:nrow(o)){
  for(j in 1:nrow(d)){
    s[i,j] <- exp(-beta * dist[i,j])
  }  
}

for(i in 1:nrow(o)){
  for(j in 1:nrow(d)){
   lines(c(o[i,1], d[j,1]), c(o[i,2], d[j,2]), 
         lwd = 2 * s[i,j] / mean(s))
  }  
}

Редактиране - за малко контекст на този проект, моля, вижте тук http://rpubs.com/RobinLovelace/9697


person RobinLovelace    schedule 29.10.2013    source източник
comment
вашият първи for цикъл може да бъде заменен с s <- exp(-beta * dist)   -  person Jilber Urbina    schedule 29.10.2013
comment
Ах, да - първият цикъл е там като остатък от по-сложни дефиниции на s, като например: s ‹- inc * P[i] * W[j] * exp(-beta * d[i,j]) . Все пак си представете, че има начини за изрязване на цикли дори тук. Все пак някакви идеи за линиите? трябва да има начин!   -  person RobinLovelace    schedule 29.10.2013
comment
Използване на segments() вместо линии?   -  person hadley    schedule 30.10.2013


Отговори (1)


Начин за замяна на втория цикъл е да използвате mapply:

fun <- function(row.o, row.d)
{
 lines(c(o[row.o,1], d[row.d,1]), c(o[row.o,2], d[row.d,2]), 
         lwd = 2 * s[row.o,row.d] / mean(s))
}

#all combinatios of rows of `d` and `o` 
args.od <- expand.grid(1:nrow(o), 1:nrow(d))

mapply(fun, row.o = args.od[,1], row.d = args.od[,2])

Сюжетът:

плот

person alexis_laz    schedule 29.10.2013