【问题标题】:DataTable loses connection for large tables on Shiny-Server, but not with local RunAppDataTable 与 Shiny-Server 上的大表失去连接,但与本地 RunApp 没有连接
【发布时间】:2018-05-26 19:50:21
【问题描述】:

在 Shiny-Server 上运行时,我遇到了 R Shiny DataTable 中的大表问题。渲染后,页面闪烁“尝试重新连接”,然后最终超时并失去连接。该行为在 Shiny-Server 上发布时发生,但在使用 shiny::runApp() 在本地启动时不会发生。

仅用 3 列结果对 500,000 条记录进行测试会产生问题。对于小桌子,它工作得很好。

我将问题隔离到 DT:: 包。如果我将shiny:: 用于dataTableOutputrenderDataTable,它工作正常。但这错过了 DT 提供的所有有用功能。当问题发生时,DataTable 的过滤机制仍在服务器上工作和处理,但其他闪亮的功能将不起作用。

下面的代码可以重现错误:

library(shiny)

df <- data.frame(num = rep(c(1,2,3,4,5,6,7,8,9,0), times=50000),
                 letters = rep(letters[1:10], times=50000),
                 colA = rep(c("apple","orange","pear","grape","onion"), times=100000))

ui <- navbarPage("DataTable test", id="nav",

                 tabPanel("Define Subset", 
                          # Present Datatable
                          fluidRow(DT::dataTableOutput("mdu_subset_table"), style = "font-size: 85%; width: 100%")
                 ),
                 tags$head(
                   includeCSS("styles.css")
                 )

)


server <- function(input, output, session) {
  # session$allowReconnect(TRUE)

  output$mdu_subset_table <- DT::renderDataTable(
    {df}
    , filter="top"
    , options = list(sDom  = '<"top">lrt<"bottom">ip',
                    lengthMenu = c(100,1000)
                    )
  )
}

shinyApp(ui, server)

Shiny Server 上的 R 版本为:R 版本 3.4.1 (2017-06-30) -- "Single Candle"

本地和闪亮服务器上安装的库是相同的。

闪亮服务器上的 R 控制台日志中没有出现错误:

su: ignore --preserve-environment, it's mutually exclusive to --login.

Listening on http://127.0.0.1:43761
~                                                                    
~                            
~
~
~

【问题讨论】:

  • 在不了解的情况下,我的第一个想法是在桌子上使用服务器端处理。阅读here,它可以像在您的渲染语句中添加server = TRUE 一样简单。但是,由于这表明存在网络延迟或相关问题,因此这可能会也可能不会真正解决您的问题。
  • 感谢@KevinArseneau。服务器端处理默认启用,并在本示例中使用。尝试使用客户端处理将导致直接显示有关表太大的错误消息。

标签: r datatables shiny dt


【解决方案1】:

解决了这个问题。问题是网络服务器的配置。从客户端的数据表请求的数据量大于允许的设置。

在这种情况下,服务器 Shiny 运行在使用过的 NGINX 网络服务器上。需要更改的参数是client_max_body_size,我们将其增加到20M。

http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size

【讨论】:

    【解决方案2】:

    您的问题中的output$mdu_subset_table 不完整,没有致电DT::datatable

    用下面的代码替换那个块对我有用。

    output$mdu_subset_table <- DT::renderDataTable({
    
      DT::datatable(
        df,
        filter = "top",
        options = list(
          dom = "lrtip",
          lengthMenu = c(100, 1000)
        )
      )
    
    }, server = TRUE)
    

    注意在您的问题中,您将sDom 包含在选项列表中。我没有看到在其他地方使用过,并已替换为标准的 dom 条目。

    【讨论】:

    • 谢谢凯文。我尝试了您的修改,但在闪亮服务器上运行时仍然失败。它适用于 runApp()。 sDom 是 DataTable 中已弃用的参数名称 - 与 dom 相同。
    • 嗨@AlasdairDouglas,我在生产闪亮服务器环境中使用类似的代码,其中有1M+ 行和更多列,您的示例数据集没有问题。我建议 DT 包不是你的问题所在。
    • 这对凯文有帮助,谢谢。听起来闪亮服务器可能存在配置问题,我需要在那里进行试验。
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 2019-03-03
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2012-05-11
    相关资源
    最近更新 更多