【问题标题】:How to convert and configure igraph object to JSON如何将 igraph 对象转换和配置为 JSON
【发布时间】:2020-06-30 10:54:33
【问题描述】:

我使用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. 我希望节点 ID 从 1 开始,而不是 0。
  2. 我想删除 链接中节点 ID 周围的引号(引号很好,因为它们在节点元素中),所以每个链接都写成这样{"source": 1, "target": 2},而不是{"source": "1", "target": "2"}

我当然可以为这样的小型网络手动执行此操作,但这对于大型网络来说很乏味且不可扩展。有没有更好的方法是R

【问题讨论】:

  • 1.制作JSON后不能为每个ID加1吗?
  • 是的,这就是我想做的,但是怎么做呢?
  • 一种可能是直接使用 igraph 编辑节点 ID。也许用 set_vertex_attr("id", value = 1:8)
  • 我试过net &lt;- net %&gt;% set_vertex_attr("id", value = c(1:8))但没用

标签: r json igraph netjson


【解决方案1】:

将 json 转换为 R 列表并在写回 json 之前对数据进行必要的更改很容易。下面是一个函数,可以使用 jsonlite 包中的工具来处理 d3_igraph 的输出:

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]}}

【讨论】:

  • 很好的答案。尽管您的输出看起来完全正确,但我必须在函数中做一个小改动才能为我工作:fix_d3_json &lt;- function(json) { dj &lt;- jsonlite::fromJSON(data_json) dj$nodes$id &lt;- as.numeric(dj$nodes$id) + 1 dj$links[[1]] &lt;- as.numeric(dj$links[[1]]) + 1 dj$links[[2]] &lt;- as.numeric(dj$links[[2]]) + 1 jsonlite::toJSON(dj) } ...否则链接将引用节点 ID 0-7,尽管节点元素中的 ID 属性范围从1-8。
猜你喜欢
  • 2012-08-25
  • 2023-03-17
  • 1970-01-01
  • 2017-07-29
  • 2023-03-17
  • 2021-03-01
  • 2017-06-16
  • 2021-11-23
  • 2016-12-31
相关资源
最近更新 更多