使用带有滑块的click.dt在点击未更新后进行过滤

时间:2017-02-21 18:50:13

标签: r shiny shinydashboard shinyjs shinybs

请运行此代码。当你点击数据表中的一行时,你会看到来自" a"的数字。列被绘制。这是使用callback和observeEvent完成的。这很好。

new_number = a 

但你也看到了#34; NUMBER"滑块输入。当用户更改滑块时,我希望绘图更新,以便绘图显示滑块中所选数字的次数。所以:

注释掉这一行:

new_number = a  * as.numeric(NUMBER()) 

并取消注释这一行:

new_number = a  * as.numeric(NUMBER()) 

现在重新运行代码,您会看到,当您从滑块中选择不同的数字但没有任何反应。这是因为

{{1}}

在ObserveEvent函数内部并且未单击表...只是滑块已更改。那么如何使NUMBER()成为可用的呢?

谢谢。

1 个答案:

答案 0 :(得分:2)

所有你需要做的就是将一个observeEvent放入你的observeEvent :)这样当渲染一个新的情节时R抓住更新的输入。希望这有帮助!

 library(shiny)
    library(DT)

    runApp(shinyApp(

  ui = fluidPage(
    DT::dataTableOutput('table')  ,
    selectInput("NUMBER", "Number:", c(1,100,1000000), selected = 1),
    plotOutput("p")
  ),

  server = function(input, output, session) {

    NUMBER = reactive({
      input$NUMBER
    })

    output$table <- DT::renderDataTable({
      datatable(data.frame(a = c(85,7),b=c(444,2)), rownames = FALSE, selection = 'none', callback=

                  JS("table.on('click.dt', 'tr', function() {
                     var data=table.row(this).data();
                     Shiny.onInputChange('rows',data[0]);
    });")
      )}
      )

    observeEvent(input$rows, {

      print( input$rows)   
      print( class( input$rows)  )
      a = as.numeric(input$rows)
      new_number <- a

      observeEvent(input$NUMBER, {

        print(a)
        print(NUMBER())

        number = a  * as.numeric(NUMBER())    

        output$p = renderPlot({

          # browser()
          plot( number )
        })

      })

      output$p = renderPlot({

        # browser()
        plot( new_number )

      })

    })

    }
   ))