2016-01-04 29 views
5

Parlak birden fazla eylem düğmesi kullanarak sorun yaşıyorum. Metnin eklenebileceği bir textarea yapıyorum. Bu metin, üç dizenin sonuçta olduğu şekilde işlenir. Bu üç dize daha sonra üç eylem düğmesinin etiketini yapılır. Düğmelerden biri tıklandığında, giriş metnini manipüle etmelidir.Eylem düğmesi sıfırlama gerekli (veya alternatif)

İşlem düğmesini tıklattığımda, metin doğru bir şekilde işlenir, ancak eylem süresiz olarak yinelenir. Bunun nedeni, eylem düğmesinin sıfırlanamamasıdır. Bu sorunla uğraşan çok sayıda web sayfası buldum ve çok sayıda çözüm ve çözüm denedim, ancak hiçbir işe yaramadı. Sorun observeEvent kullanmak renderUI bir bağımlılık olması

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

      ) 
     ) 
) 
) 

cevap

2

: Ben aşağıdaki kodu sunduğum üzerinde new_word() işlevi ve ikinci bağımsız değişkente input$text_in aracılığıyla. Böylece metin her değiştiğinde, renderUI tekrar çağrılır, bu yüzden eylem süresiz olarak tekrarlanır.

örneğin, bu bağımlılıkları kaldırmak için izolatı kullanmayı deneyin: Bu işler

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

! İzolatı 10000 farklı şekilde uyguladım, ama bu şekilde değil .. Teşekkürler! – Maarten