【问题标题】:Replace data in R formattable datatable using replaceData function使用 replaceData 函数替换 R 格式数据表中的数据
【发布时间】:2019-10-23 18:16:21
【问题描述】:

我需要在重新加载时平滑地替换(格式化)数据表中的数据,而页面不会闪烁。

按照@yihui 的示例:https://github.com/rstudio/DT/issues/168 我已经成功地使用 dataTableProxy 函数顺利地替换了标准数据表中的数据,而没有页面闪烁。

当通过 formattable 包包含格式时,我的代码会引发错误: 警告: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'))
                )))
        })
    }
)

当我移动滑块时,我希望重新加载表格,同时保留可格式化的样式。

【问题讨论】:

    标签: r shiny dt formattable


    【解决方案1】:

    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]
      )
    })
    

    【讨论】:

    • 谢谢 Stéphane Laurent 这解决了我的主要问题。您是否碰巧知道为什么 options = list(processing = F) 在这种情况下不起作用?我仍然可以看到“处理中”通知闪烁。
    猜你喜欢
    • 2019-11-14
    • 1970-01-01
    • 2016-06-16
    • 2020-07-21
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2020-02-27
    • 2018-07-02
    相关资源
    最近更新 更多