Передача входного значения $ в оператор JS () в блестящей таблице данных

Используя этот код для форматирования строк в моей таблице данных

 rowCallback = DT::JS(
      'function(row, data) {
        // Bold cells for those >= 5 in the first column
        if (parseFloat(data[0]) >= 5.0)
          $("td", row).css("background", "red");
      }'
    )

Я хотел бы изменить этот код так, чтобы подсветка основывалась не на статическом значении «5.0», а на входном значении $. Чтобы пользователи могли щелкнуть точку на диаграмме, и строки с этим значением будут выделены в таблице данных.

Но замена input $ click на 5 не работает. Мысли?

rowCallback = DT::JS(
          'function(row, data) {
            // Bold cells for those >= 5 in the first column
            if (parseFloat(data[0]) >= input$click)
              $("td", row).css("background", "red");
          }'
        )

person AKC    schedule 25.01.2016    source источник


Ответы (1)


Используя новейшую версию DT, вы можете сделать это без какого-либо Javascript, используя formatStyle.

Вот пример:

library(shiny)
library(DT)
shinyApp(
        ui = fluidPage(numericInput("cutoff", "Test", 5, min = 0, max = 10, step = 1),
                       DT::dataTableOutput('tbl')
        ),
        server = function(input, output) {
                output$tbl = DT::renderDataTable(
                        datatable(iris, options = list(lengthChange = FALSE)) %>% formatStyle(
                                'Sepal.Length',
                                target = 'row',
                                backgroundColor = styleInterval(input$cutoff, c('gray', 'yellow'))
                        )
                )
        }
)

Дополнительная информация и примеры здесь и здесь.

Вам, вероятно, потребуется установить разрабатываемую версию DT, запустив:

devtools::install_github('rstudio/DT')

Если вы не можете использовать версию DT для разработчиков, вот еще одно решение:

library(shiny)
library(DT)
shinyApp(
        ui = fluidPage(numericInput("cutoff", "Test", 5, min = 0, max = 10, step = 1),
                       uiOutput("tbl_holder")

        ),
        server = function(input, output) {
                output$tbl_holder <- renderUI({
                        DT::dataTableOutput('tbl')
                })

                output$tbl = DT::renderDataTable(
                        datatable(iris, options = list(lengthChange = FALSE,rowCallback = DT::JS(
                                paste0('function(row, data) {
                                // Bold cells for those >= 5 in the first column
                                if (parseFloat(data[0]) >=',input$cutoff,')
                                $("td", row).css("background", "red");
        }')
        )))) 
        }
)

Вы можете использовать paste, чтобы добавить отсечку в функцию JS, и _6 _ / _ 7_, чтобы функция, которая печатает таблицу данных, обновлялась каждый раз, когда отсечение изменяется.

person NicE    schedule 26.01.2016
comment
Я видел эту функцию, но не могу получить доступ к версии DT для разработчиков. Он все время говорит мне, что не может подключиться к серверу. Затем я попытался загрузить его напрямую и установить if из локального файла, и он продолжал давать сбой R, вызывая проблемы с памятью, поэтому я вернулся к обычной версии DT, пока они не исправили это. Если это невозможно сделать без использования версии для разработчиков, мне придется добавить вторую условную таблицу, я думаю, но это кажется пустой тратой места для простой проблемы с выделением. - person AKC; 26.01.2016
comment
хорошо, странно, я добавил другое решение, если вы не можете использовать версию для разработчиков. - person NicE; 26.01.2016