Построение линий без циклов 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