2

我正在使用 a 构建一个flex dashboard/shiny应用程序,datatable并尝试构建两个输入作为对此datatable的选择,每个选择都有一个“全部”选择​​。第一个问题是如何"user"通过选择第一选择来限制第二选择"team"

然后,使用这些输入,我想将我的数据子集为两个选择的任意组合。Team All,用户“Darwin D”将返回一个单行数据表,其中包含他的姓名、团队和其他要添加的指标等。

下面是一个 flex markdown 文档的所有代码:

---
title: "example"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
    runtime: shiny
---

```{r setup, include=FALSE}
library(shiny)
library(shinydashboard)
library(flexdashboard)
library(magrittr)
library(feather)
library(anytime)
library(data.table)
library(DT)
library(datasets)


Name <- c("Allan A","Barbara B","Charles C","Darwin D","Evelyn E","Frank F","Greg G","Hans H")
Team <- c(1,2,3,3,2,1,2,2)
users <- data.frame(Name,Team)
remove(Name,Team)
```



Inputs {.sidebar}
=======================================================================

### Input Variables

```{r global_input}
# input variable to call selection, name of field, selections/options variable
dateRangeInput('dateRange',
     label = 'Date range input: yyyy-mm-dd',
     start = Sys.Date() - 8,
     end = Sys.Date() - 1,
     min = "2013-01-01",
     max = Sys.Date() -1
   )

selectInput("teaminput","Team", c("All",unique(users$Team)))

observe({
    if( input$teaminput == "All" ) {
        subDT <- copy( users )
    } else {
        subDT <- users[ users$Team == input$teaminput, ]
    }

    updateSelectInput(
        "userinput",
        label = "User Name",
        choices = c( "All", unique(subDT$Name ) )
    )
})
```

### Intake Coordinator KPIs

```{r daily_table}
# reactive data object based on inputs above
daily_dt <- reactive({
  if(input$teaminput == "All"){
      subDT
}  else{
    subset(subDT$Team == input$teaminput)
}
  })

# render DT datatable object with sorts/search
renderDataTable(daily_dt())
```
4

2 回答 2

2

您可能希望使用 2 reactive,第一个按 Team 过滤 data.frame ,第二个按 Name 过滤第一个的结果:

---
title: "example"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
    runtime: shiny
---

```{r setup, include=FALSE}
library(DT)

users <- data.frame(
  Name = c("Allan A","Barbara B","Charles C","Darwin D","Evelyn E","Frank F","Greg G","Hans H"),
  Team = c(1,2,3,3,2,1,2,2), stringsAsFactors = FALSE)
```

Inputs {.sidebar}
=======================================================================
### Input Variables

```{r global_input}
selectInput("teaminput","Team",c("All", unique(users$Team)), selected="All")
selectInput("userinput","User Name", c("All", unique(users$Name) ), selected="All")

teamFiltered <- reactive(users[input$teaminput=="All" | users$Team==input$teaminput,])

observe(updateSelectInput(session,"userinput", choices = c("All", unique(teamFiltered()$Name)), selected="All"))
```

Results
=======================================================================
### Intake Coordinator KPIs

```{r daily_table}
userFiltered <- reactive(teamFiltered()[input$userinput=="All" | teamFiltered()$Name==input$userinput,])

renderDataTable(userFiltered())
```
于 2017-02-10T21:53:05.273 回答
0

请注意,除非您提供可重现的示例,否则我无法对此进行测试,但是这些方面的东西应该可以工作。您需要一个反应函数server,其中包括一个子集步骤和一个updateSelectInput调用。这将在您ui触发反应时更新您的输入。

observe({
    if( input$team == "All" ) {
        subDT <- copy( DT )
    } else {
        subDT <- DT[ Team == input$team, ]
    }

    updateSelectInput(
        "user",
        label = "User Name",
        choices = c( "All", unique( subDT$Name ) )
    )

})

因此,任何时间input$team发生变化,我们都会根据该选择创建一个子集,并使用该子集来更新user输入字段。

于 2017-02-09T23:52:04.730 回答