poner - manual ggplot2
Trabajando con valores reactivos y ggplot en brillante (1)
Estoy usando R y brillante para consultar una base de datos SQL. El usuario puede buscar y agregar a un marco de datos reactivos, cuyo resultado se traza en ggplot. Sin embargo, necesito cambiar las columnas de los cuadros de datos reactivos a factores para el trazado. Puedo hacer esto directamente con ggplot ( aes(factor(...),
). Sin embargo, si agrego la opción de cambiar la variable graficada usando una entrada reactiva, debo usar aes_string. Si uso aes_string, no me gustan los aes(factor(...),
,. Aquí hay un ejemplo de trabajo:
Servidor:
# Create example data
set.seed(10)
MeasurementA <- rnorm(1000, 5, 2)
MeasurementB <- rnorm(1000, 5, 2)
Wafer <- rep(c(1:100), each=10)
ID <- rep(c(101:200), each=10)
Batch <- rep(c(1:10), each=100)
dd <- data.frame(Batch, Wafer, ID, MeasurementA, MeasurementB)
# Create local connection (in reality this will be a connection to a host site)
con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(con, "dd", dd)
query <- function(...) dbGetQuery(con, ...)
# Create empty data frames to populate
wq = data.frame()
sq = data.frame()
shinyServer(function(input, output){
# create data frame to store reactive data set from query
values <- reactiveValues()
values$df <- data.frame()
# Action button for first query
d <- eventReactive(input$do, { input$wafer })
# First stage of reactive query
a <- reactive({ paste("Select ID from dd where Wafer=",d(), sep="") })
wq <- reactive({ query( a() ) })
# Output to confirm query is correct
output$que <- renderPrint({ a() })
output$pos <- renderPrint( wq()[1,1] )
# Action button to add results from query to a data frame
e <- eventReactive(input$do2, { wq()[1,1] })
b <- reactive({ paste("select Wafer, Batch, MeasurementA, MeasurementB from dd where ID=",e()," Order by ID asc ;", sep="") })
# observe e() so that data is not added until user presses action button
observe({
if (!is.null(e())) {
sq <- reactive({ query( b() ) })
# add query to reactive data frame
values$df <- rbind(isolate(values$df), sq())
}
})
# output of results
# Without mesurement choice (works)
output$boxV <- renderPlot({
ggplot(values$df, aes(factor(Wafer), MeasurementA, fill=factor(Batch))) + geom_boxplot()
})
# With measurement choice (doesnt work)
#output$boxV <- renderPlot({
#ggplot(values$df, aes_string(factor(''Wafer''), input$char, fill=factor(''Batch''))) + geom_boxplot()
#})
})
UI:
library(markdown)
shinyUI(fluidPage(
titlePanel("Generic grapher"),
sidebarLayout(
sidebarPanel(
numericInput("wafer", label = h3("Input wafer ID:"), value = NULL),
actionButton("do", "Search wafer"),
actionButton("do2", "Add to data frame"),
selectInput("char", label="Boxplot choice:",
choices = list("A"="MeasurementA", "B"="MeasurementB"),
selected="Von.fwd")
),
mainPanel(
verbatimTextOutput("que"),
verbatimTextOutput("pos"),
plotOutput("boxV")
)
)
)
)
He añadido código de diagrama de salida tanto para trabajo como para no trabajo (no funciona está comentado).
Ahora, he leído esto ( Formateo de data.frames reactivos en Shiny ) y esto ( R brillante marco de datos reactivos de modificación ) pero estoy confundido. Debido a que estoy usando valores reactivos para almacenar datos, utilizo los valores de código $ df para acceder a los datos ... pero, ¿qué sucede si quiero convertir una columna en un factor para el propósito de arriba? esto no parece funcionar:
new <- reactive(as.factor(values$df$Wafer))
Quizás estoy ladrando el árbol equivocado con esto?
Ok, resolví el problema cambiando el tipo de datos dentro de la consulta en sí:
b <- reactive({ paste("select cast(Wafer as varchar) as Wafer, cast(Batch as varchar) as Batch, MeasurementA, MeasurementB from dd where ID=",e()," Order by ID asc ;", sep="") })
De esa forma no tuve que fastidiar después. Funciona para mí, pero si alguien leyendo esto quiere decirme que es una mala idea, por favor hazlo. Soy nuevo en SQL y R así que por favor corrígeme para que pueda aprender. Gracias