Shiny 中的和弦网络叠加自身
Chord network in Shiny overlaying itself
我正在 Shiny 应用程序中渲染和弦网络。我想做的是提供两种不同的网络表示。一种基于谁受谁影响,另一种基于谁影响谁。简而言之,我所代表的是一个版本的数据集,以及该数据集在另一个版本中的转置。
我的问题是,当我渲染网络并切换输入时,新版本的绘图只是简单地覆盖了旧版本的绘图。在显示下一个情节之前,我需要以某种方式擦除上一个情节。
这个最小示例显示了默认演示文稿:
这是当我选择绘制转置数据(即我更改数据集)时发生的情况
如果我切换回原来的选择,它会再次覆盖。
我相信这个问题有一个简单的答案,我只是没能google正确的词。
下面是最少的可重现代码
library(shiny)
library(networkD3)
Data <- matrix(c(NA, 1951, 8010, 1013,
5871, NA, 16145, 990,
8916, 2060, NA, 940,
2868, 6171, 8045, NA), nrow = 4)
ui <- fluidPage(
titlePanel("Chord network"),
mainPanel( htmlOutput("inputDataChoice"),
chordNetworkOutput(outputId = "chord_network", width = "600px", height = "600px")
)
)
server <- function(input, output) {
#Choose the data type
output$inputDataChoice <- renderUI({
selectInput(inputId = "dataChoice", label = "Choose data shape",
choices=c("Influenced", "Influences"),
width = "450px"
)})
#Dataset shape based on choice
chordData <- reactive({
switch(input$dataChoice,
"Influenced" = Data,
"Influences" = t(Data))
})
#Plot
observe ({
output$chord_network <- renderchordNetwork({
chordNetwork(chordData(),
padding = 0.1,
colourScale = c("#000000",
"#FFDD89",
"#957244",
"#F26223"),
labels = c("Bob", "Brenda", "Barry", "Belinda"))
})})
}
shinyApp(ui = ui, server = server)
有趣的错误!看起来问题实际上出在所使用的包中。我很惊讶这个错误没有被报告,我猜人们没有使用 is much on shiny?!
我在呈现小部件之前通过清除 canvas 修复了错误。我不是 d3 专家,但我认为这可以通过使用 data().enter()
而不是 datum()
在包 chordNetwork.js
中修复,但不幸的是我无法让它工作。
相反,它通过在我们渲染任何图之前插入以下代码行来解决。
d3.select(el).select("g").selectAll("g").remove() //Create a blank canvas
您可以在我的分支存储库中访问此固定包,https://github.com/sada1993/networkD3。使用 devtools::install_github("sada1993/networkD3")
安装包。
也许我们可以为这个修复添加一个 PR?但是看起来这个包已经不再开发了。
这是查看更改的差异:https://github.com/christophergandrud/networkD3/compare/master...sada1993:master
我正在 Shiny 应用程序中渲染和弦网络。我想做的是提供两种不同的网络表示。一种基于谁受谁影响,另一种基于谁影响谁。简而言之,我所代表的是一个版本的数据集,以及该数据集在另一个版本中的转置。
我的问题是,当我渲染网络并切换输入时,新版本的绘图只是简单地覆盖了旧版本的绘图。在显示下一个情节之前,我需要以某种方式擦除上一个情节。
这个最小示例显示了默认演示文稿:
这是当我选择绘制转置数据(即我更改数据集)时发生的情况
如果我切换回原来的选择,它会再次覆盖。
我相信这个问题有一个简单的答案,我只是没能google正确的词。
下面是最少的可重现代码
library(shiny)
library(networkD3)
Data <- matrix(c(NA, 1951, 8010, 1013,
5871, NA, 16145, 990,
8916, 2060, NA, 940,
2868, 6171, 8045, NA), nrow = 4)
ui <- fluidPage(
titlePanel("Chord network"),
mainPanel( htmlOutput("inputDataChoice"),
chordNetworkOutput(outputId = "chord_network", width = "600px", height = "600px")
)
)
server <- function(input, output) {
#Choose the data type
output$inputDataChoice <- renderUI({
selectInput(inputId = "dataChoice", label = "Choose data shape",
choices=c("Influenced", "Influences"),
width = "450px"
)})
#Dataset shape based on choice
chordData <- reactive({
switch(input$dataChoice,
"Influenced" = Data,
"Influences" = t(Data))
})
#Plot
observe ({
output$chord_network <- renderchordNetwork({
chordNetwork(chordData(),
padding = 0.1,
colourScale = c("#000000",
"#FFDD89",
"#957244",
"#F26223"),
labels = c("Bob", "Brenda", "Barry", "Belinda"))
})})
}
shinyApp(ui = ui, server = server)
有趣的错误!看起来问题实际上出在所使用的包中。我很惊讶这个错误没有被报告,我猜人们没有使用 is much on shiny?!
我在呈现小部件之前通过清除 canvas 修复了错误。我不是 d3 专家,但我认为这可以通过使用 data().enter()
而不是 datum()
在包 chordNetwork.js
中修复,但不幸的是我无法让它工作。
相反,它通过在我们渲染任何图之前插入以下代码行来解决。
d3.select(el).select("g").selectAll("g").remove() //Create a blank canvas
您可以在我的分支存储库中访问此固定包,https://github.com/sada1993/networkD3。使用 devtools::install_github("sada1993/networkD3")
安装包。
也许我们可以为这个修复添加一个 PR?但是看起来这个包已经不再开发了。
这是查看更改的差异:https://github.com/christophergandrud/networkD3/compare/master...sada1993:master