2016-01-04 7 views
5

मुझे चमकदार में एकाधिक एक्शनबूटन का उपयोग करके कुछ परेशानी हो रही है। मैंने एक टेक्स्टरेरा बनाया है जहां टेक्स्ट डाला जा सकता है। इस पाठ को इस तरह से छेड़छाड़ की जाती है कि तीन तार परिणाम हैं। इन तीन स्ट्रिंग को फिर तीन एक्शनबूटन का लेबल बनाया जाता है। जब बटनों में से एक क्लिक किया जाता है तो उसे इनपुट टेक्स्ट में हेरफेर करना चाहिए।एक्शनबटन रीसेट की आवश्यकता है (या वैकल्पिक)

जब मैं एक्शनबटन पर क्लिक करता हूं तो टेक्स्ट सही तरीके से छेड़छाड़ की जाती है, लेकिन कार्रवाई अनिश्चित रूप से दोहराई जाती है। ऐसा इसलिए है क्योंकि एक्शन बटन रीसेट नहीं किया जा सकता है। मुझे इस समस्या से निपटने वाले कई वेब पेज मिले हैं और मैंने कई समाधान और कामकाज की कोशिश की है, लेकिन कुछ भी काम नहीं करता है। मैं नीचे दिए गए कोड प्रस्तुत किया है:

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

      ) 
     ) 
) 
) 

उत्तर

2

समस्या यह है कि renderUI आप observeEvent में उपयोग में एक निर्भरता है पर new_word() फ़ंक्शन और input$text_in पर दूसरे तर्क में। इसलिए जब भी पाठ बदलता है, तो रेंडरयूआई को फिर से बुलाया जाएगा, यही कारण है कि कार्रवाई अनिश्चित काल तक दोहराई जाती है।

उदाहरण के लिए, इन निर्भरताओं को दूर करने के अलग उपयोग करके देखें:

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

यह काम करता है! मैंने 10000 अलग-अलग तरीकों से अलग किया है, लेकिन ऐसा नहीं लगता है .. धन्यवाद! – Maarten

संबंधित मुद्दे