【问题标题】:How to work with the lists that have different lengths?如何处理具有不同长度的列表?
【发布时间】:2019-10-17 01:04:22
【问题描述】:

问题已开始here

我有一个无向图gn<100 顶点。图表很简单。所有顶点的坐标都是整数(x_i, y_i), i=1, 2,..., n,边的集合是预先定义好的,它们是长度为1单位的线段。 顶点的度数可以是234

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)

问题。如何处理不同长度的列表?

【问题讨论】:

    标签: r list for-loop igraph lapply


    【解决方案1】:

    在这种特定情况下,一种解决方案是将来自idvineigh 的元素相关联。例如,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]]$y
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 2020-05-04
      • 2018-09-01
      • 2015-05-07
      • 1970-01-01
      相关资源
      最近更新 更多