Wordcloud不会使用Shiny中的新输入进行更新

时间:2015-06-21 00:31:30

标签: r shiny

我有以下功能作为闪亮应用程序(testapp)的一部分。它会为默认选择生成单词云,但不会使用新选择进行更新。

ui.R

library(shiny)
shinyUI(fluidPage(
  # Application title
  headerPanel("Word Cloud"),

  # Sidebar with selection inputs
  sidebarPanel(width = 6,
               selectInput("firm", label="Choose a firm:", 
                           choices = c("a","b"),
                           selected = "a" )

  ),

  # Show Word Cloud
  mainPanel(
    d3CloudOutput("Plot1", width = "100%", height = 500)
  )
))

server.R

library(shiny)
library(rWordCloud) #require(devtools);install_github('adymimos/rWordCloud')
library(data.table)
source("helpers.R")
df1<-readRDS("data/df1.rds")

shinyServer(function(input, output) {
  dataInput <- reactive({

    isolate({
        readydata(input$firm)

  })
   })

    output$Plot1 <- renderd3Cloud({
      data <- dataInput()
     d3Cloud(text = data$indiv,size=data$Freq)

   })

})

helpers.R

readydata<-function(company){
   data.frame(setDT(df1)[firm==company,list(Freq=.N),by=indiv][order(Freq,decreasing=TRUE)])
  }

数据df1位于testapp内部的数据文件夹中。数据结构如下:

df1<-structure(list(firm = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("a", 
"b"), class = "factor"), indiv = structure(c(5L, 6L, 7L, 1L, 
4L, 5L, 6L, 7L, 1L, 4L, 3L, 2L, 3L, 2L, 3L, 2L, 8L, 8L, 8L, 8L
), .Label = c("bello", "billow", "dillow", "fellow", "hello", 
"kello", "nello", "tillow"), class = "factor")), .Names = c("firm", 
"indiv"), row.names = c(NA, -20L), class = "data.frame")

P.S。需要使用data.table,因为我正在聚合大量的组。需要将其设置回wordcloud的数据帧。

2 个答案:

答案 0 :(得分:2)

javascript文件d3Cloud.js中存在错误。我已将它修复为rWordCloud(https://github.com/NikNakk/rWordCloud)的一个分支,并向adymimos提交了拉取请求。实际的错误发生在htmlwidgets / d3Cloud.js的第59行

 if ( instance.lastValue !== undefined) {
   svg.remove();
   console.log('Clearing svg');
   var svg = d3.select(el).append("svg")
   .attr("class", "rWordCloud");
   instance.svg = svg;  
}

应该是

 if ( instance.lastValue !== undefined) {
   instance.svg.remove();
   console.log('Clearing svg');
   var svg = d3.select(el).append("svg")
   .attr("class", "rWordCloud");
   instance.svg = svg;  
}

否则,您需要删除isolate,并且可以将 server.R 代码简化为:

shinyServer(function(input, output) {
  output$Plot1 <- renderd3Cloud({
    data <- readydata(input$firm)
    d3Cloud(text = data$indiv,size=data$Freq)
  })
})

答案 1 :(得分:1)

我认为你的问题在这里:

dataInput <- reactive({
    isolate({
        readydata(input$firm)
    })
})

isolate函数将确保dataInput不对isolate m内的任何内容采取被动依赖,在dataInput m isolate中,dataInput()中的所有内容都是output$Plot1 <- renderd3Cloud({ data <- readydata(input$firm) d3Cloud(text = data$indiv,size=data$Freq) }) 。如果您只是删除renderd3Cloud,那么它应该按预期更新,我相信(我没有测试它)。

data<-reactive({readydata(input$firm)})是否也被用作未发布的应用的一部分?如果不是,你可以缩短:

data()

我没有使用reverse - 您可能需要使用url,然后将其称为name