thomasp85/ggraph

`geom_conn_bundle()` crashes R

ramiromagno opened this issue · 8 comments

Hi Thomas,

Using ggraph version 2.1.0.9000 (devel. version), this example code from the R Graph Gallery crashes R:

snap

From my quick inspection it seems that geom_conn_bundle() is the culprit.

Here is the code:

library(ggraph)
library(igraph)
library(tidyverse)
library(RColorBrewer)

# create a data frame giving the hierarchical structure of your individuals
set.seed(1234)
d1 <- data.frame(from="origin", to=paste("group", seq(1,10), sep=""))
d2 <- data.frame(from=rep(d1$to, each=10), to=paste("subgroup", seq(1,100), sep="_"))
edges <- rbind(d1, d2)

# create a dataframe with connection between leaves (individuals)
all_leaves <- paste("subgroup", seq(1,100), sep="_")
connect <- rbind(
  data.frame( from=sample(all_leaves, 100, replace=T) , to=sample(all_leaves, 100, replace=T)),
  data.frame( from=sample(head(all_leaves), 30, replace=T) , to=sample( tail(all_leaves), 30, replace=T)),
  data.frame( from=sample(all_leaves[25:30], 30, replace=T) , to=sample( all_leaves[55:60], 30, replace=T)),
  data.frame( from=sample(all_leaves[75:80], 30, replace=T) , to=sample( all_leaves[55:60], 30, replace=T)) )
connect$value <- runif(nrow(connect))

# create a vertices data.frame. One line per object of our hierarchy
vertices  <-  data.frame(
  name = unique(c(as.character(edges$from), as.character(edges$to))) ,
  value = runif(111)
)
# Let's add a column with the group of each name. It will be useful later to color points
vertices$group  <-  edges$from[ match( vertices$name, edges$to ) ]



#Let's add information concerning the label we are going to add: angle, horizontal adjustement and potential flip
#calculate the ANGLE of the labels
vertices$id <- NA
myleaves <- which(is.na( match(vertices$name, edges$from) ))
nleaves <- length(myleaves)
vertices$id[ myleaves ] <- seq(1:nleaves)
vertices$angle <- 90 - 360 * vertices$id / nleaves

# calculate the alignment of labels: right or left
# If I am on the left part of the plot, my labels have currently an angle < -90
vertices$hjust <- ifelse( vertices$angle < -90, 1, 0)

# flip angle BY to make them readable
vertices$angle <- ifelse(vertices$angle < -90, vertices$angle+180, vertices$angle)



# Create a graph object
mygraph <- igraph::graph_from_data_frame( edges, vertices=vertices )

# The connection object must refer to the ids of the leaves:
from  <-  match( connect$from, vertices$name)
to  <-  match( connect$to, vertices$name)

# Basic usual argument
ggraph(mygraph, layout = 'dendrogram', circular = TRUE) +
  geom_node_point(aes(filter = leaf, x = x*1.05, y=y*1.05)) +
  geom_conn_bundle(data = get_con(from = from, to = to), alpha=0.2, colour="skyblue", width=0.9) +
  geom_node_text(aes(x = x*1.1, y=y*1.1, filter = leaf, label=name, angle = angle, hjust=hjust), size=1.5, alpha=1) +
  theme_void() +
  theme(
    legend.position="none",
    plot.margin=unit(c(0,0,0,0),"cm"),
  ) +
  expand_limits(x = c(-1.2, 1.2), y = c(-1.2, 1.2))

My session info:

R version 4.3.1 (2023-06-16)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Arch Linux

Matrix products: default
BLAS:   /usr/lib/libblas.so.3.11.0 
LAPACK: /usr/lib/liblapack.so.3.11.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

time zone: Europe/Lisbon
tzcode source: system (glibc)

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] igraph_1.5.1      tidyr_1.3.0       R6_2.5.1          utf8_1.2.3        lubridate_1.9.2   tidyselect_1.2.0 
 [7] magrittr_2.0.3    glue_1.6.2        tibble_3.2.1      pkgconfig_2.0.3   timechange_0.2.0  generics_0.1.3   
[13] dplyr_1.1.2       lifecycle_1.0.3   cli_3.6.1         fansi_1.0.4       vctrs_0.6.3       compiler_4.3.1   
[19] rprojroot_2.0.3   here_1.0.1        purrr_1.0.1       rstudioapi_0.15.0 tools_4.3.1       tidygraph_1.2.3  
[25] pillar_1.9.0      rlang_1.1.1      

Thanks - I can reproduce

huh, weird - and now I can't... Maybe the other crash I experienced was unrelated

is the crash still reproducible on your system with latest versions installed?

I will try and let you know.

Indeed, still crashes.

reprex::reprex({...}, std_out_err = TRUE)

This reprex appears to crash R.
See standard output and standard error for more details.

Standard output and error

/usr/include/c++/13.1.1/bits/stl_vector.h:1125: std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::operator[](size_type) [with _Tp = Point; _Alloc = std::allocator<Point>; reference = Point&; size_type = long unsigned int]: Assertion '__n < this->size()' failed.
packageVersion("ggraph")
#> [1] '2.1.0.9000'
packageVersion("igraph")
#> [1] '1.5.1'
packageVersion("tidyverse")
#> [1] '2.0.0'
packageVersion("RColorBrewer")
#> [1] '1.1.3'

Interesting. Do you have access to a non-Linux system to test this on?

Yes, I can get my hands on a macos. I will let you know.