【问题标题】:Shiny Dashboard闪亮的仪表板
【发布时间】:2016-12-18 03:11:00
【问题描述】:

我是 R 的初学者,正在做一个小项目。有没有办法将两个过滤器应用于闪亮的数据框?我正在研究一个具有多个列的数据框,例如医学专家、城市等。专家列中有不同类型的专家(Ortho、Periodontist 等)我试图在闪亮的仪表板上获得输出,以便我过滤同时按城市和专家的数据。或仪表板上的两个过滤器,以便我首先按城市过滤,然后应用专家过滤器。输出将为我提供该城市所有专家(ortho、perio 或其他)的列表。

这是我正在处理的示例代码。提前致谢。

output$origin <- renderUI({
    options <- sort(unique(city.df$specialist))
    selectInput("city","Select Specialist",as.list(options))

【问题讨论】:

  • 你实际测试过代码吗?请分享结果。 *.com/help/how-to-ask。

标签: r shiny


【解决方案1】:

我不完全确定你想要实现什么。

根据两个或多个选定的输入对 data.frame 进行切片相当简单。

另一方面,在您的代码 sn-p 中,您指的是闪亮的函数 renderUI,它用于服务器端函数。这是 Shiny 最有趣的方面之一,但反应性也是新手最难掌握的方面之一。

这是一个没有renderUI的简单示例(故意保持简单的格式等):

library(shiny)

city <- c('London','Tokio','New York')
specialist <- c('ortho', 'perio','gyne', 'rhino')
df <- expand.grid(city = city, specialist = specialist)

opt_specialist <- sort(unique(df$specialist))
opt_city <- sort(unique(df$city))

ui <- fluidPage(
  selectInput("spec","Select Specialist",opt_specialist),
  selectInput("city","Select City",opt_city),
  verbatimTextOutput('city_'),
  verbatimTextOutput('spec_')

)

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

  output$city_ <- renderText({input$city})
  output$spec_ <- renderText({input$spec})

}

shinyApp(ui = ui, server = server)  

下面的示例使用服务器端编程。除非与更复杂的服务器端操作结合使用,否则使用它本身并没有多大意义。

library(shiny)

city <- c('London','Tokio','New York')
specialist <- c('ortho', 'perio','gyne', 'rhino')
df <- expand.grid(city = city, specialist = specialist)
opt_specialist <- sort(unique(df$specialist))
opt_city <- sort(unique(df$city))

ui <- fluidPage(
  uiOutput("origin"),
  verbatimTextOutput('city_'),
  verbatimTextOutput('spec_')

)

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

  output$origin <- renderUI({

    list(
    selectInput("spec","Select Specialist",opt_specialist),
    selectInput("city","Select City",opt_city)
    )
  })

  output$city_ <- renderText({input$city})
  output$spec_ <- renderText({input$spec})

}

shinyApp(ui = ui, server = server)

如果我遗漏了任何内容,请编辑或扩展您的帖子,我会相应地修改回复。

【讨论】:

    【解决方案2】:

    你可以做两种选择,最简单的:

    使用DT包并在表格中过滤:

    iris2 = iris[c(1:10, 51:60, 101:110), ]
    datatable(iris2, filter = 'top', options = list(
      pageLength = 5, autoWidth = TRUE
    ))
    

    这是来自DT 网站的示例:https://rstudio.github.io/DT/

    或者您必须创建两个带有您的表选项的selectInput 小部件,然后在server.R 中过滤您的数据集:

    data_filt <- reactive({
            if (input$select1 != "..."){
            data <- data[data$column1 %in% input$select1,]
            }
            if (input$select2 != "..."){
            data <- data[data$column2 %in% input$column2,]
            }
    data})
    

    【讨论】:

      【解决方案3】:

      大概在理想情况下,您需要 UI 能够首先允许通过两个变量中的任何一个进行选择,然后将后续变量的下拉列表限制在第一个子集返回的值的范围内?

      【讨论】: