values rotate hoverinfo examples change r shiny reactive-programming

rotate - r plotly axis format



R brillante aplicación con entradas dependiendo de los datos actualizados (1)

Parece que este sería un buen lugar para usar global.R. El archivo global.R se lee antes de ui.R y server.R, por lo que podría tener datos extraídos de global accesibles para la interfaz de usuario y el servidor.

Estoy construyendo una aplicación web usando brillante, y no estoy seguro de cómo estructurar mejor la aplicación ya que las entradas dependen de los datos y los resultados (gráficos) dependen de los datos agregados basados ​​en las entradas.

Traté de encontrar una aplicación simple para reproducir el problema. Mi configuración es más avanzada y no está relacionada con el ejemplo. Supongamos que tiene una línea de productos y desea analizar las ventas. Supongamos que se crea un conjunto de datos para cada día (no digo que la estructura de datos sea óptima, pero es útil para ilustrar mi pregunta). Ahora en la aplicación, uno selecciona una fecha de una lista de fechas disponibles, y luego uno selecciona un producto. Las fechas están restringidas al período para el que los datos están disponibles, y la lista de productos está restringida a los productos que realmente se vendieron el día seleccionado. Entonces, queremos trazar el valor total de las ventas para cada hora durante el día.

Voy a enumerar algunos códigos para un ejemplo a continuación, donde también se crean algunos datos de muestra. Perdón por el código "largo". Es una especie de trabajo, pero tengo algunas preocupaciones.

Mis preguntas son:

1) Me pregunto en qué orden se ejecutan las cosas, en particular cuando se carga la aplicación por primera vez, y luego cada vez que una entrada cambia. De nuevo, los datos dependen de la primera entrada, la segunda entrada depende de los datos. En tercer lugar, se calcula un conjunto de datos amigable con los gráficos que se utiliza para el gráfico. Puede observar que los errores se imprimen en la consola (y parpadean brevemente en el navegador) pero, como los valores están disponibles, se realizan actualizaciones y se muestra el gráfico. Parece poco óptimo.

2) ¿Cuál es la mejor práctica actual cuando las entradas dependen de data / server.R? Vi esto https://groups.google.com/forum/?fromgroups=#!topic/shiny-discuss/JGJx5A3Ge-A pero parece que esto no se implementó, incluso si la publicación es bastante antigua.

Aquí está el código para los dos archivos:

# ui.R ###### library(shiny) shinyUI(pageWithSidebar( headerPanel("New Application"), sidebarPanel( htmlOutput("dateInput"), htmlOutput("prodInput") ), mainPanel( plotOutput("salesplot") ) ))

Y:

#server.R ######### library(shiny) library(filehash) set.seed(1) dates <- format(seq(Sys.Date() - 10, Sys.Date(), "days"), "%Y-%m-%d") products <- LETTERS prices <- sample(10:100, size = length(products), replace = TRUE) names(prices) <- LETTERS if (file.exists("exampledb")) { db <- dbInit("exampledb") } else { dbCreate("exampledb") db <- dbInit("exampledb") for (d in dates) { no.sales <- sample(50:100, size = 1) x <- data.frame( product = sample(products, size = no.sales, replace = TRUE) ,hour = sample(8:20, size = no.sales, replace = TRUE) ,order.size = sample(1:10, size = no.sales, replace = TRUE) ) x$price <- prices[x$product] dbInsert(db, paste0("sales", gsub("-", "", d)), x) } } current <- reactiveValues() shinyServer(function(input, output) { inputDates <- reactive({ sort(strptime(unique(substr(names(db), 6, 13)), "%Y%m%d")) }) output$dateInput <- renderUI({ dateInput( inputId = "date", label = "Choose hour", min = min(inputDates()), max = max(inputDates()), format = "yyyy-mm-dd", startview = "month", weekstart = 0, language = "en") }) inputProducts <- reactive({ current$data <<- dbFetch(db, paste0("sales", format(input$date, "%Y%m%d"))) sort(unique(current$data$product)) }) output$prodInput <- renderUI({ selectInput( inputId = "product", label = "Choose Product", choices = inputProducts(), selected = 1) }) output$salesplot <- renderPlot({ pdata <- aggregate(I(order.size*price) ~ hour, data = subset(current$data, product == input$product), FUN = sum) colnames(pdata)[2] <- "value" plot(value ~ hour, data = pdata, xlim = c(8, 20)) }) })