Как преобразовать и настроить объект igraph в JSON

Я использовал d3r пакет для преобразования igraph объект в формате JSON, например:

# create small world network    
net <- sample_smallworld(size = 8, dim = 1, nei = 1, p = 0.33) 

# convert to json with directional edges   
data_json <- d3_igraph(as.directed(net)) 

Это дает мне следующий результат:

> data_json
{"nodes":[{"id":"0"},{"id":"1"},{"id":"2"},{"id":"3"},{"id":"4"},{"id":"5"},{"id":"6"},{"id":"7"}],"links":[{"source":"0","target":"1"},{"source":"1","target":"6"},{"source":"2","target":"3"},{"source":"3","target":"4"},{"source":"0","target":"4"},{"source":"3","target":"5"},{"source":"6","target":"7"},{"source":"0","target":"7"},{"source":"1","target":"0"},{"source":"6","target":"1"},{"source":"3","target":"2"},{"source":"4","target":"3"},{"source":"4","target":"0"},{"source":"5","target":"3"},{"source":"7","target":"6"},{"source":"7","target":"0"}],"attributes":{"name":"Watts-Strogatz random graph","dim":1,"size":8,"nei":1,"p":0.33,"loops":false,"multiple":false}} 

Это почти то, что я хочу, но мне нужно настроить две вещи:

  1. Я хочу, чтобы идентификаторы узлов начинались с 1, а не с 0.
  2. Я хочу удалить кавычки вокруг идентификаторов узлов в ссылках (кавычки в порядке, поскольку они находятся в элементе узлов), чтобы каждая ссылка была написана следующим образом{"source": 1, "target": 2}, вместо того {"source": "1", "target": "2"}

Я, конечно, мог бы просто сделать это вручную для такой небольшой сети, как эта, но это утомительно и не масштабируется для больших сетей. Есть способ лучше, этоR?

1 ответ

Решение

Достаточно легко преобразовать json в список R и внести необходимые изменения в данные перед обратной записью в json. Вот функция, которая должна помочь с выводомd3_igraph, используя инструменты из jsonlite пакет:

fix_d3_json <- function(json)
{
  dj <- jsonlite::fromJSON(data_json)
  dj$nodes$id   <- as.numeric(dj$nodes$id) + 1
  dj$links[[1]] <- as.numeric(dj$links[[1]]) + 1
  dj$links[[2]] <- as.numeric(dj$links[[2]]) + 1
  jsonlite::toJSON(dj)
}

Итак, теперь вы можете:

library(igraph)
library(d3r)

# create small world network    
net <- sample_smallworld(size = 8, dim = 1, nei = 1, p = 0.33) 

# convert to json with directional edges   
data_json <- d3_igraph(as.directed(net))

# Fix json
data_json <- fix_d3_json(data_json)

data_json
#> {"nodes":[{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":6},{"id":7},
#> {"id":8}],"links":[{"source":1,"target":6},{"source":1,"target":2},
#> {"source":2,"target":3},{"source":3,"target":4},{"source":2,"target":6},
#> {"source":3,"target":6},{"source":6,"target":7},{"source":1,"target":7},
#> {"source":6,"target":1},{"source":2,"target":1},{"source":3,"target":2},
#> {"source":4,"target":3},{"source":6,"target":2},{"source":6,"target":3},
#> {"source":7,"target":6},{"source":7,"target":1}],"attributes":
#> {"name":["Watts-Strogatz random graph"],"dim":[1],"size":[8],"nei":[1],
#> "p":[0.33],"loops":[false],"multiple":[false]}}
Другие вопросы по тегам