2016-04-19 18 views
2

Ich baue eine Shiny-Anwendung mit dem Typ navbarPage(). Ich habe drei Registerkarten - die erste Registerkarte hat eine TextInput() - Box, die Standardtext definiert hat. Das mainPanel() dieser Seite hat ein Histogramm und eine Tabelle. Auf Seite laden diese Updates und spiegeln die richtigen Informationen beim Starten der Anwendung basierend auf diesem Standardtext wider.Shiny Application actionButton Klick auf Seite laden

Die zweite Registerkarte soll eine Wordcloud basierend auf diesem Standardtext darstellen. Wenn ich auf diese Registerkarte umschalte gibt es einen Fehler - wenn ich zurück zur ersten Registerkarte gehe und neuen Text eintrage und den actionButton drücke - wird die wordcloud aktualisiert, aber es wird nicht so lange dauern, bis ich diese Aktion ausführe.

Gibt es eine Möglichkeit, die actionButton() oder eine Art von Submit passieren, wenn die Seite lädt, damit die Registerkarte mit der Wordcloud aktualisieren kann? Oder vielleicht muss ich nur eine Variable global oder etwas machen. Ich bin mir nicht sicher. Ich habe viel Zeit damit verbracht und eine Wand getroffen. Jede Hilfe würde sehr geschätzt werden.

-Code für die Benutzeroberfläche:

tabPanel("Word Cloud Diagram", 
     fluidRow(
      sidebarPanel(
      width = 3, 
      h5("The sentence input:"), 
      wellPanel(span(h5(textOutput(
       'sent' 
      )), style = "color:red")), 
      sliderInput(
       "maxWC", 
       h5("Maximum Number of Words:"), 
       min = 10, 
       max = 100, 
       value = 50 
      ), 
      br(), 
      #actionButton("update", "Update Word Cloud"), 
      hr(), 
      helpText(h5("Help Instruction:")), 
      helpText(
       "Please have a try to make the prediction by using 
       the dashboard on right side. Specifically, you can:" 
      ), 
      helpText("1. Type your sentence in the text field", style = 
         "color:#428ee8"), 
      helpText(
       "2. The value will be passed to the model while you are typing.", 
       style = "color:#428ee8" 
      ), 
      helpText("3. Obtain the instant predictions below.", style = 
         "color:#428ee8"), 
      hr(), 
      helpText(h5("Note:")), 
      helpText(
       "The App will be initialized at the first load. 
       After", 
       code("100% loading"), 
       ", you will see the prediction 
       for the default sentence example \"Nice to meet you\" 
       on the right side." 
      ) 
      ), 
      mainPanel(
      h3("Word Cloud Diagram"), 
      hr(), 
      h5(
       "A", 
       code("word cloud"), 
       "or data cloud is a data display which uses font size and/ 
       or color to indicate numerical values like frequency of words. Please click", 
       code("Update Word Cloud"), 
       "button and", 
       code("Slide Input"), 
       "in the side bar to update the plot for relevant prediction." 
      ), 
      plotOutput("wordCloud"), 
      # wordcloud 
      br() 
      ) 
      )), 

-Code für den Server:

wordcloud_rep <- repeatable(wordcloud) 
output$wordCloud <- renderPlot({ 
    v <- terms() 
    wordcloud_rep(
    v[, 2], 
    v[, 1], 
    max.words = input$maxWC, 
    scale = c(5, 1.5), 
    colors = brewer.pal(4, "Dark2") 
) 
}) 

Auch ich bin eine einzelne Datei Anwendung "app.R" verwenden - nicht sicher, ob dies nützliche Informationen oder nicht. Auf der ersten Registerkarte wird der Standardtext beim Laden der ersten Seite angezeigt. Ich möchte nur, dass dieser beim Laden der Seite auf Wordcloud erweitert wird, sodass der Plot sofort angezeigt wird, ohne dass neuer Text eingegeben und gesendet werden muss. Vielen Dank!

+0

Sie haben kein vollständiges reproduzierbares Beispiel veröffentlicht, daher ist es schwer zu sagen. Im Allgemeinen wird jedoch der gesamte Servercode beim Start der App ausgeführt, es sei denn, er hängt von einem Ereignis ab. Sie können also Ihren wordcloud-Code in eine Funktion einfügen und sie dann im Server-Code außerhalb von "observeEvent" und dann wieder in "observeEvent" ausführen. –

+0

warmoverflow - Danke für den Vorschlag - Ich bin noch ein bisschen neu in Shiny. Also, in meinem ui.R Code, habe ich den Aufruf von renderPlot (wordCloud) - das ist der Code, den ich beim Laden der Seite aktualisieren möchte. In meinem Server.R Teil des Codes habe ich eine Funktion wordclous_rep, also wie würde ich das außerhalb des observerEvent ausführen? Wo und was sollte ich tun? Muss ich nur einen Aufruf an den RenderPlot (wordCloud) an den Anfang meines Servercodes verschieben? Oder? Vielen Dank für Ihre Hilfe. – azdatasci

+0

Ich kann Sie auf meinen vollständigen Code hinweisen, wenn Sie einen Blick darauf werfen müssen, es war einfach zu viel, um auf SO zu posten. – azdatasci

Antwort

2

Hier ist ein Beispiel, das nah sein sollte, was Sie wollen. Der Trick besteht darin, eine submitButton zu verwenden. Die Wordcloud wird ein Standard-Plot haben, basierend auf der ursprünglichen Eingabe, wird sich aber ändern, wenn Sie den Text ändern und die Senden-Taste drücken.

library(shiny) 
library(wordcloud) 

ui <- shinyUI(fluidPage(

    titlePanel("Old Faithful Geyser Data"), 

    sidebarLayout(
     sidebarPanel(
     textInput("text", "Input Text", "Random text random text random is no yes"), 
     submitButton("Submit") 
    ), 

     mainPanel( 
      tabsetPanel(
       tabPanel("Tab1", 
         plotOutput("hist"), 
         tableOutput("hist_table")), 
       tabPanel("Tab2", 
         plotOutput("wordcloud")) 
     ) 
    ) 
    ) 
)) 

server <- shinyServer(function(input, output) { 

    observe({ 
     word_list = strsplit(input$text, " ") 
     word_table = as.data.frame(table(word_list)) 

     output$hist = renderPlot({ 
      barplot(table(word_list)) 
     }) 
     output$hist_table = renderTable({ 
      word_table 
     }) 
     output$wordcloud = renderPlot({ 
      wordcloud(word_table[,1], word_table[,2]) 
     }) 
    }) 

}) 

shinyApp(ui = ui, server = server) 
+0

Ahh, perfekt. Ich denke, ich kann dies in meinen Code implementieren. Vielen Dank für das Beispiel. Es spielt keine Rolle, ob ich meine Tabs mit navbarPage() oder tabsetPanel() definiere, richtig? – azdatasci

+0

Sollte auch funktionieren. Sieht nur etwas anders aus. –

+0

Danke! Ich werde es versuchen! – azdatasci