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.
Sieht lustig aus, aber ich habe jetzt keine Zeit, es anzugehen. Vielleicht später heute Abend. –
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. –
@ 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. –