【问题标题】:DataTable with no data没有数据的数据表
【发布时间】:2020-09-15 18:54:29
【问题描述】:

一定是晚了,因为我想不通。当我在 DataTable 下面运行 Shiny 应用程序时,它显示为空白。

你能帮我找出我的错误吗?

据我所知,如果没有选择输入,df_filtered 应该返回df。它被renderDataTable 称为反应函数。

library(shiny)
library(shinydashboard)
library(DT)
library(dplyr)

# Test data
LANZ <- c(1,2,3,4,5)
TIPO <- c('V5', 'V5', 'V10', 'V10', 'V10')
PROY <- c('1', '2', '2', '2', '3')
YEAR <- c(2019, 2020, 2020, 2020, 2019)
df <- data.frame(LANZ, TIPO, PROY, YEAR)
colnames(df)[1] <- "LANZ"
colnames(df)[2] <- "TIPO"
colnames(df)[3] <- "PROY"
colnames(df)[4] <- "YEAR"

ui <- dashboardPage(
  dashboardHeader(title = "Title"),
  dashboardSidebar(
    sidebarMenu(
    )),
  dashboardBody(
    
    wellPanel(
      fluidRow(
        column(4, selectInput("idYearD", "", selected=NULL, multiple=FALSE, choice=c('Year' = '', c("2019","2020")))),
        column(4, selectInput("idTipo", "", selected=NULL, multiple=FALSE, choice=c('Tipo' = '', c("V5","V10")))),
        column(4, selectInput("idProy", "", selected=NULL, multiple=FALSE, choice=c('Proy' = '', c("1","2","3")))
        )),

      fluidRow(
        column(12, DT::dataTableOutput('dataTable'))
      ))
))


server <- function(input, output) {
  
  df_filtered <- reactive({
    
    data_df <- df
    if (!is.null( input$idYearD ) ) {
      data_df <- data_df %>% filter(YEAR %in% input$idYearD)
    }
    if (!is.null( input$idTipo )) {
      data_df <- data_df %>% filter(TIPO %in% input$idTipo)
    }
    if (!is.null( input$idProy )) {
      data_df <- data_df %>% filter(PROY %in% input$idProy)
    }
    data_df
  })
  
  output$dataTable <- DT::renderDataTable(
    df_filtered()
  )
}

shinyApp(ui = ui, server = server)

最好的问候。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    预先说明: is.null 没有注意到input$idYearD 可以是(并且开头是)空字符串""。使用!is.null(.) &amp;&amp; nzchar(.)shiny::isTruthy(.)

    旁注: input$idYearD 是一个字符串,而您的 YEAR 是一个数字。 R 通过推断比较(强制转换/强制)来做直观的事情,但您需要注意这是在进行字符串比较,而不是数字比较。它在这里工作。这在处理浮点数和/或事物顺序时更有影响力,因为&lt;&gt;(以及sortorder ...)正在进行字母比较。 .. "11" &lt; 2 与直觉相反。


    我所做的是在您的 df_filtered 反应块中插入 browser()

      df_filtered <- reactive({
        browser()
        # ...
      })
    

    从那里开始,执行,测试

    !is.null( input$idYearD )
    # [1] TRUE
    input$idYearD
    # [1] ""
    

    所以也许这个块代替:

      df_filtered <- reactive({
        
        data_df <- df
        if ( isTruthy( input$idYearD ) ) {
          data_df <- data_df %>% filter(YEAR %in% input$idYearD)
        }
        if ( isTruthy( input$idTipo ) ) {
          data_df <- data_df %>% filter(TIPO %in% input$idTipo)
        }
        if ( isTruthy( input$idProy ) ) {
          data_df <- data_df %>% filter(PROY %in% input$idProy)
        }
        data_df
      })
    

    或者(更简洁),您可以这样做:

      df_filtered <- reactive({
        df %>%
          filter(
            !isTruthy( input$idYearD ) | YEAR %in% input$idYearD,
            !isTruthy( input$idTipo ) | TIPO %in% input$idTipo,
            !isTruthy( input$idProy ) | PROY %in% input$idProy
          )
      })
    

    编辑删除is.null,因为isTruthy(NULL)!is.null(NULL) 相同。

    如果由于某种原因,isTruthy 在您的未来不能完全满足您的所有需求,您的原始代码可以被扩充为仅用于特定于字符串的比较,如

        if (!is.null( input$idYearD ) && nzchar( input$idYearD )) {
    

    【讨论】:

      猜你喜欢
      • 2021-02-17
      • 2015-12-19
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      相关资源
      最近更新 更多