R Markdown

library(ndtv)
library(xml2)
library(data.table)
library(jsonlite)
library(magrittr)
inf <- fromJSON("https://dracor.org/api/corpora/ger/play/grabbe-napoleon")$cast
url <- "https://dracor.org/api/corpora/ger/play/grabbe-napoleon/segmentation"
xml <- read_xml(url, encoding = "UTF-8")
tit <- xml_find_all(xml, ".//sgm/@title") %>% xml_contents %>% as_list %>% unlist
wtt <- xml_find_all(xml, ".//sgm") %>% as_list
unl <- sapply(wtt, function(x) unlist(x))
seg <- data.frame(member = unlist(unl),scene = rep(tit,sapply(unl, length)), sceneid = rep(1:length(unl), sapply(unl, length)))

segdt <- as.data.table(seg)
segdt[, id:=member %>% as.factor %>% as.numeric]
segdt[,Nmem:= .N, by = scene]
segcomb <- segdt[Nmem>1, id %>% sort %>% combn(2) %>% t %>% as.data.table, by = .(scene, sceneid)] 
segcomb[, onset := sceneid]
segcomb[, terminus := max(onset)+1]
setnames(segcomb, c("V1", "V2"), c("tail", "head"))
base.net <- network(segcomb[,c("tail", "head")], matrix.type = "edgelist", directed = F)

bibl <- unique(segdt[,.(id, member)])
bibl <- merge(bibl, inf, by.x = 'member', by.y = "id", all.x = T, all.y = F)

base.net %v% "vertex.id" <- bibl[id %in% (base.net %v% "vertex.names"), member] %>% as.character
base.net %v% "Name" <- bibl[id %in% (base.net %v% "vertex.names"), name] %>% as.character
base.net %v% "Sex" <- bibl[id %in% (base.net %v% "vertex.names"), sex]
#base.net %v% "IsGroup" <- bibl[id %in% (base.net %v% "vertex.names"), isGroup]

vs <- data.frame(onset=0, terminus=max(segcomb$onset)+1, vertex.id=sort(unique(c(segcomb$tail, segcomb$head))))



net.dyn <- networkDynamic(base.net=base.net, edge.spells=segcomb[,c(5:6, 3:4)], vertex.spells=vs) 
## Edge activity in base.net was ignored
## Created net.obs.period to describe network
##  Network observation period info:
##   Number of observation spells: 1 
##   Maximal time range observed: 0 until 26 
##   Temporal mode: continuous 
##   Time unit: unknown 
##   Suggested time increment: NA
render.d3movie(net.dyn,
               displaylabels = F,#displaylabels = T, label = net.dyn %v% "vertex.id", label.cex = 0.2,
               vertex.tooltip = paste("<b>Name:</b>", (net.dyn %v% "vertex.id") , "<br>",
                              "<b>Sex:</b>", (net.dyn %v% "Sex")),
               output.mode='htmlWidget')
## slice parameters:
##   start:0
##   end:26
##   interval:1
##   aggregate.dur:1
##   rule:latest