2017-11-23 8 views
1

私はすでにトピックを開く1つの質問があります。さて、私はこれに似たアプリをやろうとしています。Shiny:動的なデータフレームの構築。 renderUI、observe、reactiveValuesそして、最初にテーブルから変数を選択する新しいカテゴリを追加したいと思います。私は、アプリケーション内の他の要素と変数を組み合わせることはできません。誰かが私が間違っていることを私に説明することができましたか? ご覧のとおり、グラフィックスプログラムはうまくいきません。 enter image description here 以下は、あなたがそれを使用していないし、代わりにあなただけのどこにデータフレームを表示している%に%を持つ列をフィルタリングするために同じ条件を使用することができますので、あなたがdata2を必要としないスクリプトシャイニー:テーブルに変数を選択

#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(
     selectizeInput("show_vars", "Columns to show:", 
        choices = colnames(data), multiple = TRUE, 
        selected = c("Category1","Info","Category2")), 
     uiOutput("category1"), 
     uiOutput("category2"), 
     uiOutput("sizeslider") 
    ), 
    mainPanel(
     tableOutput("table") 
    ) 
) 
) 

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


    data2 <- reactive({ 
    req(input$table) 
    if(input$table == "All"){ 
     return(data) 
    } 
    data[,names(data) %in% input$show_vars] 
    }) 


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

問題は、選択した項目に関係なく、すべての列が表示されていますか? – amrrs

+0

表示する列を選択できるようにします。したがって、この例にありますが、すべての列が表示されていることがわかります。 – Kim

答えて

0

です。

#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(
     selectizeInput("show_vars", "Columns to show:", 
        choices = colnames(data), multiple = TRUE, 
        selected = c("Category1","Info","Category2")), 
     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,names(data) %in% input$show_vars]} 
    }) 

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

    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],names(data) %in% input$show_vars]} 
    }) 

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

shinyApp(ui, server) 
+0

これは良い解決策ではありません。他の変数(category、sizeslider)を変更すると、多くの警告とエラーが表示されるためです。 – Kim

+0

以前に表示されていませんでしたか? – amrrs

+0

@Kim数値の列を持たずに数値スライダがあるときに警告を表示しています。しかし、誰かが列を選択できるようにしたかったのですか? – amrrs

関連する問題