Я все еще изучаю Shiny и R и чувствую, что это море, где мне все еще нужно учиться довольно много. Пожалуйста, извините меня, если мой метод кодирования не идеален и подскажите, где код может быть импровизирован.
Я создаю это приложение, где мне нужно создавать кросс-вкладки и диаграммы. Мне нужно отфильтровать переменную базы данных, выбранную пользователем, и на основе того, что таблицы и диаграммы должны обновляться.
Так, например, если пользователь выбирает "Store_location" в качестве переменной фильтра, я хочу отобразить список значений для этой переменной ниже этого с помощью флажка, поэтому
LOC1 LOC2 loc3 loc4
должен отображаться с флажком, и пользователь может выбрать один/несколько из этих значений. Основы этого мои данные должны быть отфильтрованы. Поэтому, если пользователь выбирает loc1 и loc2, данные должны быть отфильтрованы на основе условия (Store_location == "loc1" | Store_location == "loc2" )
Как только пользователь отключает флажок ИЛИ выбирает другую переменную для фильтра, соответственно данные должны обновляться, а также кросс-таблицы и диаграммы. Я считаю, что это должно быть сделано в Shiny, я пытался использовать checkboxGroupInput, но не смог передать выбранную переменную и, следовательно, получить ошибки. В настоящее время прокомментировали это, чтобы код работал. Я создал образец данных, который находится в формате CSV и был прочитан в приложении. Данные огромны и, следовательно, используют data.table fread для чтения данных. Таким образом, любая подзадача должна быть выполнена в data.table. Я делаю переформатирование/создание переменных при нажатии кнопки "Подготовить данные для анализа". Для этого я использую функцию registerEvent ({}), и весь мой renderTable/renderplot находится внутри этого события. Я чувствую, что будет лучший способ справиться с этим. Если да, то предложите.
Наконец, мой загрузчик дает мне ошибку, "разрешено только" grobs "в" gList ", а иногда ошибка" замена имеет 17 строк, данные - 0". Я хочу создать файл pdf с кросс-таблицами и построить один под другим. Предлагайте, где я ошибаюсь.
Примеры данных можно найти здесь - примеры данных
Ниже приведен фрагмент кода для моего приложения -
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)
Итак, чтобы подвести итог, вам нужна ваша помощь для запуска этого приложения для -
-
Динамическое отображение значений для выбранной переменной фильтра и фильтрация данных, чтобы обновить кросс-таблицы и графики. Примечание. Данные большие и в data.table
-
Downloader для загрузки выходов в формате pdf.
Спасибо!