2016-11-29 19 views
1

私は、ShinyのrenderUI機能を使ってデータを動的にサブセット化する方法の問題は、たびたび起こると思いますが、observe、reactive、reactiveValuesなどの他の機能よりもrenderUI(uiOutputを使用)をいつ使用するのか分かりません。条件付きパネル。シャイニー:ダイナミックデータフレーム構築; renderUI、observe、reactiveValues

私は、すべての選択肢が他の入力で選択できる内容に影響を与える、完全にインタラクティブなデータフレームを構築したいと考えています。この例では、selectInput(single)、selectInput(multi)、およびsliderInput(max &分)を使用します。

プライマリセレクトCategory 1は、カテゴリ1または「All」の任意の値にできます。カテゴリ1で何かを選択すると、カテゴリ2に表示できる内容とスライダの値の範囲に影響します。カテゴリ2を最初に選択すると、カテゴリ1のオプションとスライダの値(常にサブセットの最大値と最小値を表します)が制限されます。 sliderInputで始めると、指定した範囲のデータがない場合、カテゴリ1とカテゴリ2は制限されます。

N.B.私は、アプリケーションの初期化時にデータフレームをリセットするための「リセット」アクションボタンを組み込みます。

いくつかのダミーデータを使用しようとしましたが、私はそれを動作させることができませんでした。これはカテゴリ1でサブセット化され、スライダを更新しますが、カテゴリ2を変更してもレンダリングされたテーブルは上書きされません。

require(shiny) 

    data <- data.frame(Category1 = rep(letters[1:3],each=15), 
         Info = paste("Text info",1:45), 
         Category2 = sample(letters[15:20],45,replace=T), 
         Size = sample(1:100, 45), 
         MoreStuff = paste("More Stuff",1:45)) 

ui <- fluidPage(

    titlePanel("Test Explorer"), 

    sidebarLayout(
    sidebarPanel(
     uiOutput("category1"), 
     uiOutput("category2"), 
     uiOutput("sizeslider") 
    ), 
    mainPanel(
     tableOutput("table") 
    ) 
) 
) 

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

    df_subset <- reactive({ 
    if(input$cat1=="All") {df_subset <- data} 
    else{df_subset <- data[data$Category1==input$cat1,]} 

    }) 

    df_subset1 <- reactive({ 
    if(is.null(input$cat2)){df_subset()} else {df_subset()[df_subset()$Category2==input$cat2,]} 
    }) 

    output$category1 <- renderUI({ 
    selectizeInput('cat1', 'Choose Cat 1', choices = c("All",sort(as.character(unique(data$Category1)))),selected = "All") 
    }) 

    output$category2 <- renderUI({ 
    selectizeInput('cat2', 'Choose Cat 2 (optional):', choices = sort(as.character(unique(df_subset1()$Category2))), multiple = TRUE,options=NULL) 
    }) 

    output$sizeslider <- renderUI({ 
    sliderInput("size", label = "Size Range", min=min(df_subset1()$Size), max=max(df_subset1()$Size), value = c(min(df_subset1()$Size),max(df_subset1()$Size))) 
    }) 

    output$table <- renderTable({ 
    df_subset1() 
    }) 

} 

shinyApp(ui, server) 

答えて

1

何が起こっているのか細かなことは、しかし、これはあなたが欲しいものですか?注:reactiveeventReactiveに変更されているため、具体的にはinputにバインドされています。また、私はあなたのselectizeInput

編集のために複数の選択を持っている%in%演算子を使用:あなたも、スライダーを使用していけない、あなたの最初のコードでは、私は残念ながら

#rm(list = ls()) 
library(shiny) 

data <- data.frame(Category1 = rep(letters[1:3],each=15), 
        Info = paste("Text info",1:45), 
        Category2 = sample(letters[15:20],45,replace=T), 
        Size = sample(1:100, 45), 
        MoreStuff = paste("More Stuff",1:45)) 

ui <- fluidPage(

    titlePanel("Test Explorer"), 
    sidebarLayout(
    sidebarPanel(
     uiOutput("category1"), 
     uiOutput("category2"), 
     uiOutput("sizeslider") 
    ), 
    mainPanel(
     tableOutput("table") 
    ) 
) 
) 

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

    output$category1 <- renderUI({ 
    selectizeInput('cat1', 'Choose Cat 1', choices = c("All",sort(as.character(unique(data$Category1)))),selected = "All") 
    }) 

    df_subset <- eventReactive(input$cat1,{ 
    if(input$cat1=="All") {df_subset <- data} 
    else{df_subset <- data[data$Category1 == input$cat1,]} 
    }) 

    df_subset1 <- reactive({ 
    if(is.null(input$cat2)){df_subset()} else {df_subset()[df_subset()$Category2 %in% input$cat2,]} 
    }) 

    output$category2 <- renderUI({ 
    selectizeInput('cat2', 'Choose Cat 2 (optional):', choices = sort(as.character(unique(df_subset()$Category2))), multiple = TRUE,options=NULL) 
    }) 

    output$sizeslider <- renderUI({ 
    sliderInput("size", label = "Size Range", min=min(df_subset1()$Size), max=max(df_subset1()$Size), value = c(min(df_subset1()$Size),max(df_subset1()$Size))) 
    }) 

    df_subset2 <- reactive({ 
    if(is.null(input$size)){df_subset1()} else {df_subset1()[df_subset1()$Size >= input$size[1] & df_subset1()$Size <= input$size[2],]} 
    }) 

    output$table <- renderTable({ 
    df_subset2() 
    }) 
} 

shinyApp(ui, server) 

enter image description here

+0

これをフィルタリングにこれを追加しましたスライダはまだ出力に影響を及ぼさず、category2の選択はレンダリングされたテーブルを更新しません(ただちに表示される前に何かを行うことができます) – Sam

+0

サンプルコードでスライダを使用しない、a少なくとも次回はそれを試してください –

+3

あなたの不思議な攻撃的な助けに感謝します。私はそれが理解できる見落としであったと思うし、見落としはすべてそれだった、スライダーを逃すために、かなり多くのコードで進んでいた。ありがとう、すべて同じ。 – Sam

関連する問題