2016-12-16 19 views
0

私はまだシャイニーとRを学んでいて、それでも私はかなり多くのことを学ぶ必要がある海だと感じています。私のコーディング方法が理想的でない場合は、私の言い訳をしてください。シャイニーダイナミックフィルタ選択変数値の選択と表示

私はクロスタブとチャートを生成する必要があるこのアプリケーションを作成しています。私は、ユーザーが選択したデータ基底変数をフィルタリングする必要があり、テーブルとチャートを更新する必要があるということに基づいています。

ユーザーがフィルタ変数として「Store_location」を選択した場合ので、たとえば、私はチェックボックスで、その下に、この変数の値のリストを表示したいので、

LOC1 LOC2 LOC3 LOC4

がチェックボックスで表示され、ユーザーはこれらの値の1つまたは複数を選択できます。私のデータはフィルタリングされるべきです。したがって、ユーザーがloc1とloc2を選択すると、データは条件に基づいてフィルタリングされます(Store_location == "loc1" | Store_location == "loc2")

ユーザーがチェックボックスをオフにするか、データが更新され、クロス集計とチャートが取得されます。私はこれがシャイニーでできると信じて、checkboxGroupInputを使用しようとしていましたが、選択された変数を渡すことができず、エラーが発生しました。現在、コードが実行されるようにこれをコメントしています。 CSV形式のサンプルデータを作成し、アプリで読み込んでいます。データは膨大であり、したがってdata.table freadを使用してデータを読み取ります。したがって、どのサブ設定もdata.tableで行う必要があります。私は、「分析用データの準備」ボタンがクリックされたときに、変数の再フォーマット/作成を行っています。このため私はobserveEvent({})を使用しています。私のすべてのrenderTable/renderplotはこのイベント内にあります。私はこれを処理するより良い方法があると思う。はいの場合はお勧めします。

最後に、私のダウンローダは私にエラーを与えています。 "gList"には "grobs"しか許されていません。 "replacementは17 rows、data has 0"のようなエラーがあります。私はクロス集計を使ってpdfファイルを生成し、もう一方を下にプロットしたいと思います。私が間違っているところを示唆してください。

データはここで見つけることができますサンプル - sample data以下

は私のアプリのコードスニペットである -

library("shiny") 
library("shinythemes") 
library("tools") 
library("readxl") 
library("data.table") 
library("bit64") 
library("gmodels") 
library("ggplot2") 
library("plotly") 
library("gridExtra") 

### User Interface 
ui <- shinyUI(
    navbarPage('My Shiny App', 
      tabPanel("Insights", 
         sidebarPanel(
         fileInput('file1', 'Choose input data', 
            accept=c('text/csv', 'text/comma-separated-values,text/plain', '.csv')), 
         tags$hr(), 
         actionButton(inputId = 'run1', label = "Prepare data for Analysis"), 
         tags$br(), 
         tags$br(), 
         fluidRow(
          column(10, 
           div(style = "font-size: 13px;", selectInput("filtervar", label = "Select Filter Variable", '')) 
         ), 
          tags$br(), 
          tags$br(), 
          wellPanel(
          # checkboxGroupInput("filteroptions", "Filter Options", choices = sort(unique(fil))) 
         ), 
          column(10, 
           div(style = "font-size: 13px;", selectInput("rowvar", label = "Select Row Variable", '')) 
         ), 
          tags$br(), 
          tags$br(), 
          column(10, 
           div(style = "font-size: 13px;", selectInput("columnvar", "Select Column Variable", '')) 
         )), 
         downloadButton('export',"Download Outputs") 
        ) 
         , 
         mainPanel(
         tabsetPanel(id='mytabs', 
            tabPanel("Data", tags$b(tags$br("Below is the top 6 rows of the data prepared")),tags$br(),tableOutput("table.output")), 
            tabPanel("Table",tags$b(tags$br("Table Summary")),tags$br(),tableOutput("crosstab1"),tags$br(),verbatimTextOutput("datatab1")), 
            tabPanel("Chart",tags$b(tags$br("Graphical Output")),tags$br(),plotlyOutput("plot1")) 
         ) 
        )), 
      tabPanel("Help") 
)) 

server <- shinyServer(function(input, output,session){ 
    #Below code is to increase the file upload size 
    options(shiny.maxRequestSize=1000*1024^2) 
    observeEvent(input$run1,{ 
    updateTabsetPanel(session = session 
         ,inputId = 'myTabs') 
    inFile <- input$file1 

    if (is.null(inFile)) 
     return(NULL) 

    data_input <- fread(inFile$datapath) 

    data_input[,`:=` (YN2014 = ifelse(Year == "Y2014",1,0),YN2015 = ifelse(Year == "Y2015",1,0))] 

    ## vals will contain all plot and table grobs 
    vals <- reactiveValues(t1=NULL,t2=NULL,t3=NULL,p1=NULL,p2=NULL) 

    output$table.output <- renderTable({ 
     #  top6rows 
     head(data_input) 
    }) 

    s <- reactive(
     data_input 
    ) 

    observe({ 
     updateSelectInput(session, "rowvar", choices = (as.character(colnames(data_input))),selected = "Store_location") 
    }) 

    observe({ 
     updateSelectInput(session, "columnvar", choices = (as.character(colnames(data_input))),selected = "Year") 
    }) 

    observe({ 
     updateSelectInput(session, "filtervar", choices = (as.character(colnames(data_input))),selected = "Store_location") 
    }) 

    output$conditionalInput <- renderUI({ 
     if(input$checkbox){ 
     selectInput("typeInput", "Product type", 
        choices = sort(unique(input$filtervar))) 
     } 
    }) 

    output$crosstab1 <- renderTable({ 
     validate(need(input$rowvar,''), 
       need(input$columnvar,'')) 
     vals$t1 <- addmargins(xtabs(as.formula(paste0("~",input$rowvar,"+",input$columnvar)), s())) 
    },caption = "<b>Cross-Tab - 1</b>", 
    caption.placement = getOption("xtable.caption.placement", "top"), 
    caption.width = getOption("xtable.caption.width", 200)) 

    output$datatab1 <- renderPrint({ 
     validate(need(input$rowvar,''), 
       need(input$columnvar,'')) 
     vals$t2 <- as.data.frame(with(s(), CrossTable(get(input$rowvar),get(input$columnvar),max.width = 1,prop.c = T,prop.r = F,prop.t = F,prop.chisq = F,chisq = F,format = "SPSS",dnn = c(input$rowvar,input$columnvar)))) 

    }) 

    #plotting theme 
    .theme<- theme(
     axis.line = element_line(colour = 'gray', size = .75), 
     panel.background = element_blank(), 
     plot.background = element_blank() 
    )  

    output$plot1 <- renderPlotly({ 
     vals$p1 <- ggplot(data_input, aes(get(input$rowvar), ..count..)) + 
     geom_bar(aes(fill = get(input$columnvar)), position = "dodge") + 
     theme(axis.text.x=element_text(angle=90, hjust=1), 
       axis.line = element_line(colour = 'gray', size = .75), 
       panel.background = element_blank(), 
       plot.background = element_blank()) + 
     xlab(input$rowvar) + 
     ylab("Frequency") + 
     labs(fill=input$columnvar) 
    }) 

    ## clicking on the export button will generate a pdf file 
    ## containing all grobs 
    output$export = downloadHandler(
     filename = function() {paste0("RES_Insights_Outputs_",Sys.Date(),".pdf")}, 
     content = function(file) { 
     pdf(file, onefile = TRUE) 
     grid.arrange(vals$t1,vals$p1) 
     dev.off() 
     } 
    ) 

    }) 

}) 

shinyApp(ui = ui, server = server) 

ので、まとめるために、このアプリを実行するために、あなたの助けに必要に -

  1. フィルタ変数の値を動的に表示し、クロス集計とプロットが更新されるようにデータをフィルタリングします。ノートデータは大きく、data.tableにあります。

  2. Downloaderをpdf形式でダウンロードしてください。

ありがとうございました!

答えて

0

ここでは、目的の列に対して選択した値の関数でデータフレームをサブセット化する方法があります。

あなたは行と列の選択入力で何をしたいのか分かりませんでした。

ui <- navbarPage("My Shiny App", 
       tabPanel("Insights", 
          sidebarPanel(
          fileInput("file1", "Choose input data"), 
          selectInput("filtervar", "Select Filter Variable", NULL), 
          checkboxGroupInput("filteroptions", "Filter Options", NULL) 
          ), 
          mainPanel(
          tabsetPanel(id = "mytabs", 
             tabPanel("Data", tableOutput("table.output")) 
          ) 
         ) 
       ) 
) 

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

    values <- reactiveValues() 

    observe({ 
    file <- input$file1 

    if (is.null(file)) 
     return() 

    values$data <- fread(file$datapath) 

    vars <- names(values$data) 

    updateSelectInput(session, "filtervar", choices = vars) 
    }) 

    observe({ 

    data <- isolate(values$data) 

    filter.var <- input$filtervar 

    if (is.null(filter.var) || filter.var == "") 
     return() 

    values <- data[[filter.var]] 

    if (is.factor(values)) { 
     options <- levels(values) 
    } else { 
     options <- unique(values[order(values)]) 
    } 

    updateCheckboxGroupInput(session, "filteroptions", 
          choices = options, 
          selected = as.character(options)) 

    }) 

    output$table.output <- renderTable({ 

    isolate({ 
     data <- values$data 
     var <- input$filtervar 
    }) 

    values <- input$filteroptions 

    if(is.null(data)) { 
     return() 
    } else if (is.null(var) || var == "") { 
     return(data) 
    } else if (is.null(values)) { 
     return(data[FALSE]) 
    } else { 

     if (is.numeric(data[[var]])) 
     values <- as.numeric(values) 

     setkeyv(data, var) 
     return(data[.(values)]) 
    } 

    }) 


} 

shinyApp(ui = ui, server = server) 
+0

ご回答ありがとうございます。これは、選択された変数の項目を取得するのに役立ち、元のデータはフィルタリングされませんが、チェックボックスを使用してオプションを選択できます。行と列varの選択入力について説明しましょう。これらの変数を選択することで、テーブルとクロス集計を動的に更新しています。現在のデータを使用します。私のコードasisを実行し、これらのselectinputで変数を変更すると、私の言いたいものが得られます。だから今、フィルタオプションの選択をベースに、私は、テーブルとチャートの両方が更新された基礎フィルタリングされたデータを取得するように、データをフィルタリングしたかった。これは実現可能ですか? – user1412

関連する問題