2

問題が発生しました。

次のような風景があります。

# Create a graph
g1 <- graph.full(5)
V(g1)$name <- letters[1:vcount(g1)]
V(g)
Vertex sequence:
[1] "a" "b" "c" "d" "e"

# Contract vertex "a" and "b"
vec = c(1,1,2,3,4)
contract_1 <- contract.vertices(g1, vec, vertex.attr.comb=toString)
V(contract_1)
Vertex sequence:
[1] "a, b" "c" "d" "e"  

# Contract vertex "a, b" and "c"
vec = c(1,1,2,3)
contract_2 <- contract.vertices(contract_1, vec, vertex.attr.comb=toString)
V(contract_2)
Vertex sequence:
[1] "a, b, c" "d" "e"

など... (「a、b、c」と「d」をコントラクトし、頂点「a、b、c、d」を作成)

前のレベルの頂点を区別する必要があります。

例えば。:

頂点 "a, b " および "c" を縮小することにより、"|" として追加のマークアップを使用する必要があります。また ";"。この場合、結果は "a, b | c" または "a, b- c" または "a, b; c" になります。

頂点 "a, b, c" と "d" を縮約すると、結果は "a, b, c | d" または "a, b, c; d" になります。

私はいくつかのことを試しました...

例えば。:

g <- contract.vertices(g, matching, 
  vertex.attr.comb=list(name=function(x) paste(toString(x,"",sep=";"))))

ただし、動作しません

4

1 に答える 1

2

paste引数もありcollapseます:

contract.vertices(
  contract_1, 
  c(1,1,2,3), 
  vertex.attr.comb = list( name = function(x) paste(x, collapse=";") )
)

ネストされた括弧を使用することもできます:

library(igraph)
g <- list()
k <- 5
g[[1]] <- graph.full(k)
V(g[[1]])$name <- letters[1:vcount(g1)]
for(i in 2:k) { 
  g[[i]] <- contract.vertices(
    g[[i-1]],
    c(1,1,2:k)[1:(k-i+2)],
    vertex.attr.comb = list( name = function(x) 
      if( length(x) > 1 ) paste0( "(", paste0(x,collapse=","), ")" ) else x
    )
  )
}
lapply(g, V)
# [[1]]
# Vertex sequence:
# [1] "a" "b" "c" "d" "e"
# [[2]]
# Vertex sequence:
# [1] "(a,b)" "c"     "d"     "e"    
# [[3]]
# Vertex sequence:
# [1] "((a,b),c)" "d"         "e"        
# [[4]]
# Vertex sequence:
# [1] "(((a,b),c),d)" "e"            
# [[5]]
# Vertex sequence:
# [1] "((((a,b),c),d),e)"
于 2013-08-08T14:20:09.883 に答える