Не удается отобразить два конкретных виджета в одном и том же HTML-документе (связанном из файла .Rmd), но любой из них отлично работает по отдельности.

Я пытаюсь связать два виджета или графика (диаграмму аккордов и диаграмму Санки) вместе в одном html-документе, и я совершенно не понимаю, почему они не отображаются в результирующем html. Либо один работает в одиночку, но не вместе. Следовательно, в каждом сюжете/виджете нет ничего «неправильного» как такового, но, возможно, это какая-то конфликтующая проблема «размера»? Кроме того, этот пример .Rmd является подмножеством, и каждая фигура прекрасно работает с кучей других фрагментов и фигур r, поэтому кажется, что эти два графика явно конфликтуют друг с другом.

Я попытался изменить размер виджетов html либо внутри функций сюжета, либо постфактум htmlwidgets-r?rq=1">(изменение ширины виджета). Похоже, я неэффективен в реализации таких процедур (используя руководство по выписке книг) или это не решение.

Я попытался сохранить эти цифры как отдельные виджеты и импортировать их в html, но это тоже не сработало. Самое главное, я думаю, что если вы закомментируете любой виджет, каждый из них отлично отобразится в созданном html.

Я довольно новичок в rmarkdown, и мне удалось справиться со многими другими проблемами, но эта разочаровывающая поставила меня в тупик. Любая помощь / руководство будет принята с благодарностью!

---
title: "How can I get these widgets to be displayed together (not just work in isolation)?"
author: "scf"
date: "December 20, 2019"
output:
  html_document:
    self_contained: true
---

#### Figure 1: chord diagram (data = netm)
```{r chord diagram, echo = FALSE, message = FALSE}

# Libraries
  devtools::install_github("mattflor/chorddiag")
  library(chorddiag); library(ggplot2)

# Create netm
  netm <- structure(c(3, 0, 0, 4, 3, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 7, 0, 
0, 9, 2, 0, 0, 0, 1, 0), .Dim = c(5L, 5L), .Dimnames = list(c("1", 
"2", "3", "4", "5"), c("1", "2", "3", "4", "5")))

# Plot object
  # Set color
  categ.col <- c("#A5E9DE", "#E286DF", "#DCE87A", "#93F340", "#6948CC")

# Build the chord diagram:
  chorddiag(netm,
                 groupColors = categ.col[1:incl],
                 groupnamePadding = 20,
                 width = 800,
                 height = 800)

detach("package:chorddiag", unload = TRUE)

```

#### Figure 2:  sankey diagram (data = edges.df & nodes.df)
```{r Sankey plot, echo = FALSE, message = FALSE}

# Create edge network
  edges.df <- structure(list(Source = c("1_categ1", "4_categ1", "5_categ1", 
"6_categ1", "8_categ1", "9_categ1", "11_categ1", "12_categ1", 
"13_categ1", "14_categ1", "16_categ1", "17_categ1", "20_categ1", 
"21_categ1", "22_categ1", "23_categ1", "25_categ1", "26_categ1", 
"27_categ1", "28_categ1", "30_categ1", "31_categ1", "32_categ1", 
"34_categ1", "35_categ1", "36_categ1", "38_categ1", "1_categ1", 
"4_categ1", "5_categ1", "6_categ1", "8_categ1", "9_categ1", "11_categ1"
), Target = c("1_categ2", "1_categ2", "1_categ2", "1_categ2", 
"1_categ2", "1_categ2", "1_categ2", "1_categ2", "1_categ2", "1_categ2", 
"1_categ2", "1_categ2", "1_categ2", "1_categ2", "1_categ2", "1_categ2", 
"1_categ2", "1_categ2", "1_categ2", "1_categ2", "1_categ2", "1_categ2", 
"1_categ2", "1_categ2", "1_categ2", "1_categ2", "1_categ2", "2_categ2", 
"2_categ2", "2_categ2", "2_categ2", "2_categ2", "2_categ2", "2_categ2"
), Freq = c(5L, 5L, 1L, 3L, 2L, 1L, 2L, 1L, 2L, 7L, 5L, 1L, 6L, 
1L, 3L, 1L, 6L, 2L, 1L, 1L, 1L, 4L, 2L, 8L, 1L, 2L, 1L, 3L, 10L, 
1L, 3L, 2L, 2L, 2L), IDsource = c(0, 1, 2, 3, 4, 5, 6, 7, 8, 
9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
25, 26, 0, 1, 2, 3, 4, 5, 6), IDtarget = c(27, 27, 27, 27, 27, 
27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 
27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28)), row.names = c(1L, 
4L, 5L, 6L, 8L, 9L, 11L, 12L, 13L, 14L, 16L, 17L, 20L, 21L, 22L, 
23L, 25L, 26L, 27L, 28L, 30L, 31L, 32L, 34L, 35L, 36L, 38L, 40L, 
43L, 44L, 45L, 47L, 48L, 50L), class = "data.frame")

# Create nodes.df from edges.df
  nodes.df <- data.frame(label=unique(c(as.character(edges.df$Source),as.character(edges.df$Target))))

  edges.df$IDsource <- match(edges.df$Source, nodes.df$label)-1 
  edges.df$IDtarget <- match(edges.df$Target, nodes.df$label)-1

# Library
  library(networkD3)

# Make the Network
  networkD3::sankeyNetwork(Links = edges.df, Nodes = nodes.df,
                       Source = "IDsource", Target = "IDtarget",
                       Value = "Freq", NodeID = "label",
                     fontSize = 15,
                     nodeWidth = 80,
                     fontFamily = "times",
                       sinksRight=T)

  detach("package:networkD3", unload = TRUE)

```

person scf    schedule 22.12.2019    source источник
comment
Ваш пример не работает: вы не говорите, где взять chorddiag (работает devtools::install_github("mattflor/chorddiag")) и не определяете переменную incl (я угадал 5). Когда я исправляю эти вещи, я получаю сообщение об ошибке в консоли Javascript в моем браузере: это, вероятно, из-за несовместимости между двумя пакетами, которые используют библиотеку D3. Я думаю, вам придется опубликовать отчет об ошибке на странице (страницах) Github.   -  person user2554330    schedule 23.12.2019
comment
Этот отчет github.com/mattflor/chorddiag/issues/25 похож на ваш. но с другим несовместимым пакетом D3. И похоже, что в отношении пакета chorddiag не было никаких действий в течение нескольких лет, так что вы можете самостоятельно исправить это.   -  person user2554330    schedule 23.12.2019
comment
@ user2554330, спасибо за комментарий. Ваша ссылка (которую я раньше не видел) привела меня к другим ссылкам . Я думаю, вы правы. Я попрошу разработчика убедиться.   -  person scf    schedule 23.12.2019
comment
Это более распространено, чем я думал (ссылка), и я нахожусь в длинной очереди люди, имеющие эту проблему.   -  person scf    schedule 23.12.2019


Ответы (1)


Это возможно, но это большая проблема.

Проблема в том, что chorddiag использует версию 3.x D3, а networkD3 использует 4.x. Фреймворк htmlwidgets загружает только более позднюю версию, поэтому возникает ошибка, когда пакет chorddiag пытается использовать функции D3.

Обходной путь для этого — загрузить оба, переименовав один из них. Например, если вы измените код для более старого пакета так, чтобы имя библиотеки было d3_3, а не просто d3, все будет работать. Есть много мест, где используется d3, и вам нужно исправить их все. Недостаток в том, что chorddiag использует другую библиотеку, которая зависит от D3, поэтому ее необходимо исправить, чтобы она зависела и от d3_3.

Вы можете увидеть первую попытку этого подхода здесь: https://github.com/dmurdoch/chorddiag . На вашем примере это работает, но изменения, вероятно, неполные, поэтому вам нужно будет найти и исправить пропущенные.

person user2554330    schedule 23.12.2019