2016-01-04 12 views
5

Sto riscontrando qualche problema nell'utilizzo di più pulsanti di azione in modalità lucida. Ho costruito una textarea in cui inserire il testo. Questo testo è manipolato in modo tale che tre stringhe sono il risultato. Queste tre stringhe sono quindi rese l'etichetta dei tre pulsanti di azione. Quando si fa clic su uno dei pulsanti, è necessario manipolare il testo di input.Reset del pulsante di azione necessario (o alternativo)

Quando faccio clic sul pulsante di azione, il testo viene manipolato correttamente, ma l'azione viene ripetuta indefinitamente. Questo perché il pulsante di azione non può essere ripristinato. Ho trovato più pagine web che si occupano di questo problema e ho provato più soluzioni e soluzioni alternative, ma niente sembra funzionare. Ho presentato il codice qui sotto:

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") 

      ) 
     ) 
) 
) 

risposta

2

Il problema è che nel renderUI si utilizza nel observeEvent hanno una dipendenza su input$text_in tramite la funzione new_word() e input$text_in nel secondo argomento. Quindi, ogni volta che il testo cambia, il renderUI verrà richiamato di nuovo, motivo per cui l'azione viene ripetuta indefinitamente.

Provare a utilizzare isolare per rimuovere queste dipendenze, ad esempio:

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

Questo funziona! Ho applicato l'isolamento in 10000 modi diversi, ma non in questo modo sembra .. Grazie! – Maarten

Problemi correlati