использование click.dt с ползунками для фильтрации после клика без обновления

Пожалуйста, запустите этот код. Когда вы нажмете на строку в таблице данных, вы увидите, что число из столбца «а» отображается на графике. Это делается с помощью обратного вызова и наблюдаемого события. Это прекрасно работает.

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)

      print(a)
      print(NUMBER())
      new_number = a      #THIS WORKS!!!
      #new_number = a  * as.numeric(NUMBER())    #THIS DOES NOT WORK     multiple a by the number in the slider when the SLIDER Is CHANGED

      output$p = renderPlot({

        # browser()
        plot( new_number )
      })

    })}
))

Но вы также видите ползунок «ЧИСЛО». Когда пользователь меняет ползунок, я бы хотел, чтобы график обновлялся, чтобы на графике отображалось число, умноженное на число, выбранное на ползунке. Так:

закомментируйте эту строку:

new_number = a 

и раскомментируйте эту строку:

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

Теперь перезапустите код, и вы увидите, что при выборе разных чисел на ползунке ничего не происходит. Это потому что

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

находится внутри функции ObserveEvent, и таблица НЕ БЫЛА нажата... просто был изменен ползунок. Итак, как сделать NUMBER() доступным, чтобы это работало?

Спасибо.


person user3022875    schedule 21.02.2017    source источник


Ответы (1)


Все, что вам нужно было сделать, это поместить наблюдаемое событие в ваше наблюдаемое событие :) Таким образом, при рендеринге нового графика 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 )

      })

    })

    }
   ))
person Eligijus Bujokas    schedule 21.02.2017
comment
Спасибо, а что, если у меня есть несколько входов select? Скажем, у меня есть NUMBER1 и CATEGORY, как должен быть установлен параметрObservEventObservEvent(input$NUMBER, input$CATEGORY { ........ output$p=renderplot() })? - person user3022875; 21.02.2017