2013-10-29 66 views
3

我正在爲空間互爲作用的模型流圖,其中XY循環座標兩者的起點和終點:沒有繪製線中的R

flows

的問題是,我一直使用嵌套的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

+1

你的第一個'for'循環可以被替換爲'< - exp(-beta * dist)' –

+0

啊是的 - 第一個循環是作爲s的更復雜定義的遺蹟,比如:s < - inc * P [i] * W [j] * exp(-beta * d [i,j])。儘管如此,想象一下,即使在這裏也有切割循環的方法。任何關於線的想法雖然?必須是一種方式! – RobinLovelace

+1

使用'segments()'而不是行? – hadley

回答

0

的一種方式,以取代第二環是使用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]) 

情節:

plot