2017-02-09 41 views
1

我正在构建一个flex dashboard/shiny应用程序datatable并尝试构建两个输入作为此datatable的选择,每个选择都有一个“全部”选项。第一个问题是我如何通过选择第一个选项"team"来限制第二个选择"user"如何使用更新和多重选择在我的闪亮应用中创建多个输入?

然后,使用这些输入,我想将我的数据分为任意两个选择组合。管理团队,用户“达尔文d”将返回单行数据表以他的名字,团队和其他指标要添加等

低于柔性降价文件中的所有代码:

--- 
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()) 
``` 
+0

增加了一个完整的代码示例。 – gscott

回答

1

您可能需要使用2 reactive,第一个过滤由团队的data.frame,第二次按名称过滤的第一个结果:

--- 
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()) 
``` 
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输入字段。

+0

已添加。我明白你要去哪里 - 完美。在输出端怎么样?你认为嵌套子帧是最好的吗?我曾尝试过的实现是4个结果的条件选择:Both = all,Team = selected,Name = selected,Team和Name = selected。那有意义吗? – gscott