2016-01-04 15 views
5

Ich habe einige Probleme mit mehreren Aktionstasten in glänzend. Ich habe ein Textfeld erstellt, in das Text eingefügt werden kann. Dieser Text wird so manipuliert, dass drei Strings das Ergebnis sind. Diese drei Saiten werden dann zur Bezeichnung der drei Aktionsknöpfe gemacht. Wenn eine der Schaltflächen angeklickt wird, sollte sie den Eingabetext manipulieren.Actionbutton Reset benötigt (oder alternativ)

Wenn ich auf die actionbutton klicke, wird der Text korrekt bearbeitet, aber die Aktion wird unbestimmt wiederholt. Dies liegt daran, dass die Aktionstaste nicht zurückgesetzt werden kann. Ich habe mehrere Webseiten gefunden, die sich mit diesem Problem beschäftigen, und habe mehrere Lösungen und Workarounds ausprobiert, aber nichts scheint zu funktionieren. Ich habe den Code unten dargestellt:

server.R

library(shiny) 
library(stringi) 

new_word_f <- function(x) { 
     x <- substr(x, nchar(x), nchar(x)) == " " 
} 

modify_text_input <- function(new_word, input_text, word_to_remove, answer) { 
     if (new_word == TRUE) { 
      paste(input_text, answer, " ") 
     } else { 
      paste(stri_replace_last_regex(input_text, word_to_remove,  answer), " ") 
     } 
} 


start_input_text <- "Testing the lines " 
ngram_input <- "lines" 
answer <- c("a", "b", "c") 

## Start shiny app 
shinyServer(function(input, output) { 

    ## New word or current mid-word 
    new_word <- reactive({new_word_f(input$text_in)}) 

    output$input_textarea <- renderUI({tags$textarea(id="text_in", rows=3, cols=40, start_input_text)}) 
    output$text1 <- renderText({input$text_in}) 
    output$text2 <- renderText({new_word()}) 

    output$but1 <- renderUI({actionButton("action1", label = answer[1])}) 
    output$but2 <- renderUI({actionButton("action2", label = answer[2])}) 
    output$but3 <- renderUI({actionButton("action3", label = answer[3])}) 


    ## On button press 
    observeEvent(input$action1, {output$input_textarea <- renderUI({tags$textarea(id="text_in", rows=3, cols=40, modify_text_input(new_word(), input$text_in, ngram_input, answer[1]))})}) 
    observeEvent(input$action2, {output$input_textarea <- renderUI({tags$textarea(id="text_in", rows=3, cols=40, modify_text_input(new_word(), input$text_in, ngram_input, answer[2]))})}) 
    observeEvent(input$action3, {output$input_textarea <- renderUI({tags$textarea(id="text_in", rows=3, cols=40, modify_text_input(new_word(), input$text_in, ngram_input, answer[3]))})}) 


}) 

ui.R

library(shiny) 
library(stringi) 

shinyUI(
    fluidPage(
     titlePanel("Word prediction"), 

     sidebarLayout(
       sidebarPanel(
        uiOutput("input_textarea"), 
        uiOutput("but1"), 
        uiOutput("but2"), 
        uiOutput("but3") 

      ), 

       mainPanel(
        textOutput("text1"), 
        textOutput("text2") 

      ) 
     ) 
) 
) 

Antwort

2

Das Problem ist, dass in der renderUI Sie in der observeEvent verwenden, um eine Abhängigkeit haben auf input$text_in durch die new_word() Funktion und die input$text_in im zweiten Argument. Jedes Mal, wenn sich der Text ändert, wird die renderUI erneut aufgerufen, weshalb die Aktion unendlich oft wiederholt wird.

Versuchen Isolat mit diesen Abhängigkeiten zu entfernen, zum Beispiel:

observeEvent(input$action1, {output$input_textarea <- renderUI({ 
tags$textarea(id="text_in", rows=3, cols=40, modify_text_input(isolate(new_word()),isolate(input$text_in),ngram_input,answer[1]))}) 
}) 
+0

Das funktioniert! Ich habe Isolat auf 10000 verschiedene Weisen angewendet, aber nicht so scheint es .. Danke! – Maarten