2017-02-21 31 views
0

Пожалуйста, запустите этот код. Вы увидите, когда вы нажимаете на строку в datatable, число из столбца «a» отображается. Это делается с помощью callback и observEvent. Это прекрасно работает.с помощью 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() быть доступным, чтобы это сработало?

спасибо.

ответ

2

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

     }) 

    }) 

    } 
    )) 
+0

Спасибо, что, если у меня есть несколько входов выбора? Скажем, у меня есть NUMBER1 и CATEGORY, как следует наблюдать за установкой registerEvent (введите $ NUMBER, введите $ CATEGORY {........ output $ p = renderplot()})? – user3022875