这个问题是here开始的。
我有一个无向图g和n<100顶点。图很简单。所有顶点的坐标都是整数(x_i, y_i), i=1, 2,..., n,边集是预先定义的,它们是具有长度1单位的线段。顶点的程度可以是2、3或4。
library(igraph)
g <- graph_from_literal(1-2-3-4-5-6-7-8-1, 8-9-4)
B <- t(matrix(c(0,0, 0,1, 0,2, -1,2, -2,2, -2,1, -2,0, -1,0, -1,1), nrow =2));
V(g)$id <- seq_len(vcount(g))
V(g)$x <- B[,1]; V(g)$y <- B[,2]
plot(g, layout=as.matrix(B))

我需要为顶点设置新属性-- corner属性。
如果顶点i的度为2,且两个入射边不在同一条线上,则它就是corner顶点。在上面的图中,顶点1, 3, 5, 7是角点,而剩余顶点2, 4, 6, 8, 9是非角点。
我已经找到了度等于2的顶点列表。
idv <- V(g)[strength(g)==2]; idv # 1 2 3 5 6 7 9然后找到了i-th顶点的邻域顶点列表,并创建了新的属性:
neigh<-neighborhood(g, nodes=idv); neigh
V(g)$corner <- 0我的尝试
for(i in idv){
ifelse(V(g)[neigh[[i]][2]]$x == V(g)[neigh[[i]][3]]$x ||
V(g)[neigh[[i]][2]]$y == V(g)[neigh[[i]][3]]$y,
V(g)[neigh[[i]][1]]$corner <- 0,
V(g)[neigh[[i]][1]]$corner <- 1)}但是我有一个错误Error in neigh[[i]] : subscript out of bounds
通常情况下,neigh的长度小于或等于V(g)$id的长度。
length(neigh) # 7
length(V(g)$id) # 9我也无法比较(x_i, y_i)的坐标。
问题:如何处理长度不同的列表?
发布于 2019-05-31 11:35:22
在这种特殊情况下,一种解决方案是将来自idv的idv与neigh元素关联起来。例如,可以将neigh[[i]][2]重写为neigh[i == idv][[1]][2]],并且我们总共拥有
for(i in idv){
ifelse(V(g)[neigh[i == idv][[1]][2]]$x == V(g)[neigh[i == idv][[1]][3]]$x ||
V(g)[neigh[[i]][2]]$y == V(g)[neigh[i == idv][[1]][3]]$y,
V(g)[neigh[i == idv][[1]][1]]$corner <- 0,
V(g)[neigh[i == idv][[1]][1]]$corner <- 1)}然而,这是相当复杂和难以理解的。相反,我们可以利用这样一个事实:每个idv都有相同数量的邻居,neigh可以转换成一个矩阵:
neigh <- do.call(rbind, neigh)然后我们就有了
V(g)$corner[neigh[, 1]] <- V(g)[neigh[, 2]]$x != V(g)[neigh[, 3]]$x &
V(g)[neigh[, 2]]$y != V(g)[neigh[, 3]]$yhttps://stackoverflow.com/questions/56394089
复制相似问题