2016-12-21 4 views
2

Ich arbeite an einem Text Mining. Basierend auf den Eingaben des Benutzers erstelle ich eine Anzahl von Vorschlägen für das nächste Wort. Dieser Teil funktioniert gut. Allerdings kann die Anzahl der Vorschläge sehr groß sein, daher möchte ich höchstens 10 Vorschläge in Shiny zeigen und möchte keine NA-Werte anzeigen.Shiny App Füllung Ausgang, der von der Eingabe abhängt funktioniert nicht

Ich erstellte ein reproduzierbares Beispiel, das das gleiche Problem aufweist. Der Trick, den ich versuche zu verwenden, ist das Einfügen von "Vorschlägen" mit i. Das funktioniert, wenn meine Ausgabe nicht von meiner Eingabe abhängt. Ich habe das von http://shiny.rstudio.com/gallery/creating-a-ui-from-a-loop.html.

Meine ui.R Datei

library(shiny) 

    fluidPage(
      titlePanel("Test"), 
      fluidRow(
        textAreaInput("userText", label="Enter your text") 
      ), 
      fluidRow(
        lapply(1:5, function(i) { 
          textOutput(paste0("suggestions", i))}) 
      ) 
    ) 

Mein server.R

library(shiny) 

    mySuggestions <- c("this", "is", "a", "test", "of", "getting", "reactive", "list", "length") 

    function(input, output, session) { 

      getWords <- function(i, wrds) { 
        output[[paste0("suggestions", i)]] <- renderText({ wrds()[i] }) 
      } 

      userText <- reactive({ 
        # Leaves this function when input$userText is NULL or "" 
        req(input$userText) 
        input$userText }) 

      words <- reactive({ 
        mySuggestions[1:userText()] 
      }) 
      # Problem 
      lapply(reactive({ 1:min(5, length(words())) }), getWords(), wrds=words()) 
    } 

Wenn Sie eine positive ganze Zahl im ui Textfeld die App so viele Wörter zeigen, soll geben, aber 5 maximal.

Die obige Version des Servers.R ergibt eine Warnung "Warnung: Fehler in paste0: Argument" ich "fehlt, ohne Standard" Ich habe mehrere Versionen für diese problematische Zeile ausprobiert.

reactive({ lapply(1:min(5, length(words())), getWords(), wrds=words()) }) 

Gibt keine Fehler, aber es zeigt nichts in der Ausgabe.

lapply(1:min(5, length(words())), getWords() , wrds=words()) 

Ergebnisse in einer Warnung "Warnung: Fehler in paste0: Argument "i" fehlt, ohne default"

lapply(reactive({1:min(5, length(words()))}), getWords(), wrds=words()) 

Ergebnisse in einer Warnung "Warnung: Fehler in paste0: Argument" i "fehlt, ohne default"

 lapply(reactive({1:min(5, length(words))}), function(i) { 
       output[[paste0("suggestions", i)]] <- renderText({ words[i] }) }) 

Ergebnisse in Fehler in as.vector (x, "Liste"): nicht Typ 'Schließung' auf Vektor vom Typ 'Liste' zwingen kann

 lapply(reactive({1:min(5, length(words()))}), function(i) { 
       output[[paste0("suggestions", i)]] <- renderText({ words()[i] }) }) 

Ergebnisse in Fehler in as.vector (x, "Liste"): kann nicht Typ 'Schließung' auf Vektor vom Typ 'Liste' coerce

 reactive({lapply(1:min(5, length(words)), function(i) { 
       output[[paste0("suggestions", i)]] <- renderText({ words[i] }) }) }) 

gibt keine Fehler, aber es zeigt nichts in der Ausgabe.

 reactive({lapply(1:min(5, length(words())), function(i) { 
       output[[paste0("suggestions", i)]] <- renderText({ words()[i] }) }) }) 

Gibt keine Fehler, aber es zeigt nichts in der Ausgabe.

 lapply(1:min(5, reactive({ length(words)})), function(i) { 
      output[[paste0("suggestions", i)]] <- renderText({ words[i] }) }) 

Ergebnisse in Fehlern in min (5, reaktive ({: ungültig 'Typ' (Verschluss) Argumentations

 lapply(1:min(5, reactive({ length(words())})), function(i) { 
      output[[paste0("suggestions", i)]] <- renderText({ words()[i] }) }) 

Ergebnisse in Fehlern in min (5, reaktives ({: ungültig ‚type '(Schließung) des Arguments

Nun zeigt die folgende Zeile die eingegebene Anzahl der Wörter in einem einzelnen Textfeld.Wenn ich 2 eingeben, zeigt es 2 Wörter und wenn ich 20 eingeben, zeigt es 5 Worte.Dies ist das Verhalten, das ich will , aber ich möchte jedes Wort in einem separaten Textfeld.

output$suggestions1 <- renderText(words()[1:min(5, length(words()))]) 

Ich bin verloren. Ich wurde so verzweifelt, dass ich ein paar Dinge ausprobierte, von denen ich nicht erwartet hatte, dass sie funktionierten. Ist es möglich zu tun, was ich will? Wenn das so ist, wie? Wenn nicht, was ist das Problem? Ich habe noch nichts gefunden, was dieses spezifische Problem angeht.

+0

Sieht lustig aus, aber ich habe jetzt keine Zeit, es anzugehen. Vielleicht später heute Abend. –

+1

Versuchen Sie es einfach zu programmieren, ohne irgendwelche Lapplys und dann konsolidieren. Und sieh dir auch das Shiny Cheat Blatt # 3 an. Ausführungsmodell, um sicherzustellen, dass Ihr mentales Modell der Shiny-Ausführung korrekt ist. Ich denke, dass es nicht sein kann. –

+0

@ MikeWise. Ich habe es auch mit For-Loops probiert. Hat auch nicht funktioniert. Ich denke, es hat damit zu tun, den Umfang der 'render'- und' reactive'-Aussagen zu mischen. Ich denke, die Art, wie ich es vorher versucht habe, erforderte das Mischen dieser Bereiche und das ist wahrscheinlich nicht erlaubt. Die Verwendung von 'beobachten' funktioniert. Anscheinend ist das irgendwie ein gemischtes Bild. –

Antwort

1

Die Kombination von outputUI und renderUI funktioniert gut und hält den Code relativ einfach.

ui.R

... 
    fluidRow(
      uiOutput("suggestions") 
    ) 

server.R

library(shiny) 

    mySuggestions <- c("this", "is", "a", "test", "of", "getting", "reactive", "list", "length") 

    function(input, output, session) { 

      ... 

      output$suggestions <- renderUI({ 
        lapply(1:min(5, length(words())), function(i) { 
        output[[paste0("suggestions", i)]] <- renderText({ words()[i] }) 
      }) }) 
    } 

Ich weiß nicht, was outputUI und renderUI tat, aber sie scheinen perfekt für Situationen wie diese.

+1

Aber wird es funktionieren, wenn Sie den Wert von UserText ein paar Mal nach oben und unten ändern? Nicht überzeugt, dass Sie nicht einige unerwünschte Definitionen herumhängen werden. –

+2

Auch ein großer Vortrag über Shiny Design-Muster von dem Hauptarchitekten von Shiny: https: //www.rstudio.com/resources/webinars/shiny-developer-conference/ –

+0

@MikeWise. Du hast recht. Das Hochfahren ist kein Problem, aber wenn ich eine kleinere Nummer einstelle, funktioniert es nicht mehr. Zurück zum Zeichenbrett :( –

Verwandte Themen