2017-02-09 4 views
1

datatableflex dashboard/shinyアプリをビルドし、この選択肢として2つの入力をこの選択肢としてビルドしようとしています。datatableには、選択ごとに「すべて」が選択されています。最初の質問は、どのようにして最初の選択"team"の選択によって、第2の選択"user"を制限することができますか?アップデートと複数選択の両方で、光沢のあるアプリに複数の入力を構築するにはどうすればよいですか?

次に、これらの入力を使用して、データを2つの選択肢の任意の組み合わせにサブセット化したいと思います。私ができる

--- 
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

あなたはチームがdata.frameをフィルタリングするための最初の1、2 reactiveを使用する場合があります、名前による最初の1の結果フィルタリングする第二:

--- 
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

注:チームすべて、ユーザー「ダーウィンD」は、以下フレックス値下げドキュメントのすべてのコードなどを追加する彼の名前、チームや他のメトリックを持つ単一行のデータテーブル

を返します再現可能な例を提供しない限り、これをテストしないでください。しかし、これらの行に沿ったものは動作するはずです。 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つの結果の条件付き選択でした。それは理にかなっていますか? – gscott

関連する問題