【问题标题】:Shiny Data table display all data using filter闪亮的数据表使用过滤器显示所有数据
【发布时间】:2016-08-24 14:56:32
【问题描述】:

我可以创建一个闪亮的数据表,显示任何个体水牛的数据,但我不知道如何同时显示所有水牛数据。任何帮助表示赞赏。

样本数据:

cleanbuffalo <- data.frame(name = c("queen","toni","pepper"), longitude = c(31.8,32,33), latitude = c(-24,-25,-26))

闪亮的用户界面:

shinyUI(navbarPage("Buffalo Migration", id ="nav",
  tabPanel("Data",
    fluidRow(
      column(3,
        selectInput("allnamesbuffalo", "Buffalo", c("All Buffalo" = "all buffalo", vars))
        )
      ),
      hr(),
      DT::dataTableOutput("buffalotable")
    )
  )
)

闪亮的服务器:

shinyServer(function(input, output, session) {
    observe({
    allnamesbuffalo <- if (is.null(input$allnamesbuffalo)) character(0) else       {
          filter(cleanbuffalo, name %in% input$allnamesbuffalo) %>%
         `$`('name') %>%
         unique() %>%
         sort()
      }
    })

  output$buffalotable <- DT::renderDataTable({
    df <- cleanbuffalo %>%
      filter(
        cleanbuffalo$name == input$allnamesbuffalo,
        is.null(input$allnamesbuffalo) | name %in% cleanbuffalo$name
      )
      action <- DT::dataTableAjax(session,df)

      DT::datatable(df, options = list(ajax = list(url = action)),
                    escape = FALSE)
  })
})

【问题讨论】:

  • 这个想法是,当用户选择all buffalo 时,name 变量应该包含所有水牛名称的列表,否则它只包含特定的水牛名称。您可以在过滤器之前使用 if/else 计算names 变量。
  • 您介意更具体一点吗?我认为我需要根据使用 if/else 的用户选择来更新名称变量。但是,当我尝试更改名称变量以包括所有水牛选择中的所有水牛名称时,我得到错误。感谢您的帮助。

标签: r shiny


【解决方案1】:

这是一个工作示例。请注意,我在您的数据框中添加了stringsAsFactors=F,否则您需要使用levels(cleanbuffalo$name) 来获取名称。

library(shiny)
library(dplyr)

cleanbuffalo <- data.frame(name = c("queen","toni","pepper"), 
                           longitude = c(31.8,32,33), 
                           latitude = c(-24,-25,-26), stringsAsFactors = F)

ui <- shinyUI(fluidPage(

  titlePanel("Example"),

  sidebarLayout(
    sidebarPanel(
      selectInput("allnamesbuffalo", "Buffalo", c("all", cleanbuffalo$name))
    ),

    mainPanel(
      dataTableOutput("buffalotable")
    )
  )
))

server <- shinyServer(function(input, output, session) {

  output$buffalotable <- renderDataTable({
    names <- NULL
    if (input$allnamesbuffalo == "all") {
      names <- cleanbuffalo$name
    } else {
      names <- input$allnamesbuffalo
    }
    filter(cleanbuffalo, name %in% names)
  })

})

shinyApp(ui = ui, server = server)

【讨论】:

  • 这对我来说非常有效,感谢您的帮助。我之前有一个粗略的理解,只是无法正确地判断 if/else 语句。
猜你喜欢
  • 2019-07-04
  • 2015-07-14
  • 1970-01-01
  • 2018-10-04
  • 2017-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多