我正在制作空间相互作用模型的流程图,其中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
答案 0 :(得分: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])
情节: