Заменить данные в формате R с возможностью обработки данных с помощью функции replaceData - PullRequest
1 голос
/ 08 июня 2019

Мне нужно плавно заменить данные в (форматируемом) видеоданных, не мигая при загрузке страницы.

Следуя примеру @yihui здесь: https://github.com/rstudio/DT/issues/168 Мне удалось плавно заменить данные в стандартной таблице данных без мигания страницы с помощью функции dataTableProxy.

При включении форматированиячерез форматируемый пакет мой код выдает ошибку: Предупреждение: ошибка в as.data.frame.default: невозможно привести класс "c (" datatables "," htmlwidget ")" к data.frame

Минимальная воспроизводимостьпример:

library(shiny)
library(DT)
library(formattable)

dt <- data.frame(type = letters[1:5], count = sample(1:10, 5))

shinyApp(
    ui = fluidPage(sidebarLayout(
        sidebarPanel(
            sliderInput(
                "number",
                "Select:",
                min = 0,
                max = 10,
                value = 8
            )
        ),

        mainPanel(DT::dataTableOutput('DTtable'))
    )),

    server = function(input, output, session) {
        # Reactive expression of the data frame, subset by the slider number
        sliderValues <- reactive({
            # Compose data frame
            dt['count' > input$number,]
        })


        output$DTtable = DT::renderDataTable(as.datatable(formattable(
            isolate(sliderValues()),

            list(count = color_tile('#ffffff', '#6be560'))
        )))


        observeEvent(sliderValues(), ignoreInit = T, {
            replaceData(dataTableProxy('DTtable'),

                as.datatable(formattable(
                    isolate(sliderValues()),

                    list(count = color_tile('#ffffff', '#6be560'))
                )))
        })
    }
)

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

1 Ответ

2 голосов
/ 08 июня 2019

Небольшая ошибка в sliderValues.Замените на

sliderValues <- reactive({
  # Compose data frame
  dt[dt$count > input$number,]
})

Теперь для replaceData требуется второй кадр аргумента, а не дата.Вот почему вы получаете эту ошибку.Если у вас есть дата dtable, датафрейм находится в dtable$x$data.Но есть дополнительный столбец для имен строк, который необходимо удалить.Так же:

observeEvent(sliderValues(), ignoreInit = TRUE, {
  replaceData(dataTableProxy('DTtable'),
              as.datatable(formattable(
                isolate(sliderValues()),
                list(count = color_tile('#ffffff', '#6be560'))
              ))$x$data[,-1]
  )
})
...