2017-06-05 25 views
1

私はR Shinyを初めて使用しています。私はいくつかの動的に生成されたボタンでアプリケーションを作成しようとしています。各ボタンにはobserveEventが関連付けられています。すべてのobserveEventを削除するリセットボタンを追加したいと思います。私はいくつかのリンクを調べて、destroy()関数を同じものに使うことができることを発見しましたが、その使い方を理解することができません。助言がありますか?ありがとう。R Shiny Destroy ObserveEvent

library(shiny) 
ui<-fluidPage(
    actionButton(inputId = "add",label = "Add Stuff"), 
    htmlOutput("obs"), 
    actionButton("reset","Reset") 
) 
server<-function(input,output,session){ 

    output$obs<-renderUI(HTML({names(input)})) 

    observeEvent(input$add,{ 
    addModal<-function(failed=FALSE){ 

     modalDialog(size = "l",easyClose = T,title = "Add",footer = "", 
        selectInput(inputId = "stuff",label = "Select",choices = c("A","B","C","D","E")), 
        numericInput(inputId = "numstuff",label = "Quantity",min = 1,max = 5,value = 1), 
        actionButton(inputId = "add2",label = "Add") 
       ) 

    } 
    showModal(addModal()) 
    }) 

    num<<-0 
    observeEvent(input$add2,{ 
    num<<-num+1 
    insertUI(selector = "#add",where = "beforeBegin", 
      ui = actionButton(inputId = paste0("comp",num),label = paste0(input$stuff,":",input$numstuff)) 
    ) 
    lapply(num:num,function(i){ 
    observeEvent(input[[paste0("comp",i)]],{ 
     modModal<-function(failed=FALSE){ 

     modalDialog(size = "l",easyClose = T,title = "Delete",footer = "", 
        # numericInput(inputId = "newquan",label = "New Quantity",min=1,max=5,value=1), 
        actionButton(inputId = paste0("gomod",i),label = "Delete") 
     ) 
     } 
     showModal(modModal()) 
    },ignoreInit = T) 

    observeEvent(input[[paste0("gomod",i)]],{ 
     nm<-paste0("#comp",i) 
     removeUI(selector=nm) 
    }) 

    }) 
    }) 

    observeEvent(input$reset,{ 
    observers<-names(input) 
    lapply(observers,function(x){ 
     if(substr(x,1,4)=="comp"){ 
     obs<-input[[x]] 
     obs$destroy() 
     } 
    }) 
    }) 

} 
shinyApp(ui=ui,server=server) 

答えて

1

あなたは変数にobserve(又はobserveEvent)を割り当てる(例えばo)、次いで、観察者の体内o$destroyを呼び出さなければなりません。 See this appこれを使用する良い例があります(ただし、ユニースの場合、「シャイニーで並行してフォークされ、取り消し可能なタスクを作成する」というのはおそらくあなたよりもはるかに複雑です)。いずれにしても、その場でそのメカニズムが見えます。

this app私はあなたがより簡単な方法で(once = TRUE引数を使用して)欲しいものを達成すると思います。