Ich habe eine einfache glänzende App erstellt. Das Ziel ist es, eine histogram
mit Optionen zum Bearbeiten der Grafik für jeden Datensatz zu erstellen. Das Problem ist, dass wenn ich eine Dataset-Anwendung ändere, zeige mir zuerst ein leeres Plot und dann ein korrektes Plot. Um das Problem zu verstehen, füge ich renderText
hinzu, die mir eine Reihe von Zeilen im getDataParams
Datensatz zeigen. Es scheint mir, dass isolate
Funktion sollte eine Lösung sein, aber ich habe mehrere Konfigurationen versucht, anscheinend verstehe ich immer noch nicht diese Funktion.isolieren Funktion mit reaktiven Objekt Basis auf dplyr glänzend
library(lazyeval)
library(dplyr)
library(shiny)
library(ggplot2)
data(iris)
data(diamonds)
ui <- fluidPage(
column(3,
selectInput("data", "", choices = c('', 'iris', 'diamonds')),
uiOutput('server_cols'),
uiOutput("server_cols_fact"),
uiOutput("server_params")
),
column(9,
plotOutput("plot"),
textOutput('text')
)
)
server <- function(input, output) {
data <- reactive({
switch(input$data, diamonds = diamonds, iris = iris)
})
output$server_cols <- renderUI({
validate(need(input$data != "", "Firstly select a dataset."))
data <- data()
nam <- colnames(data)
selectInput('cols', "Choose numeric columns:", choices = nam[sapply(data, function(x) is.numeric(x))])
})
output$server_cols_fact <- renderUI({
req(input$data)
data <- data(); nam <- colnames(data)
selectizeInput('cols_fact', "Choose a fill columns:",
choices = nam[sapply(data, function(x) is.factor(x))])
})
output$server_params <- renderUI({
req(input$cols_fact)
data <- isolate(data()); col_nam <- input$cols_fact
params_vec <- unique(as.character(data[[col_nam]]))
selectizeInput('params', "Choose arguments of fill columns:", choices = params_vec,
selected = params_vec, multiple = TRUE)
})
getDataParams <- reactive({
df <- isolate(data())
factor_col <- input$cols_fact
col_diverse <- eval(factor_col)
criteria <- interp(~col_diverse %in% input$params, col_diverse = as.name(col_diverse))
df <- df %>%
filter_(criteria) %>%
mutate_each_(funs(factor), factor_col)
})
output$text <- renderText({
if(!is.null(input$cols)) {
print(nrow(getDataParams()))
}
})
output$plot <- renderPlot({
if (!is.null(input$cols)) {
var <- eval(input$cols)
print('1')
diversifyData <- getDataParams()
factor_col <- input$cols_fact
print('2')
plot <- ggplot(diversifyData, aes_string(var, fill = diversifyData[[factor_col]])) +
geom_histogram(color = 'white', binwidth = 1)
print('3')
}
plot
})
}
shinyApp(ui, server)
Danke für die Erklärung. Aber ich versuche tatsächlich, eine Lösung zu finden, die dieses Problem vollständig löst, daher ist die derzeitige Situation nicht akzeptabel. – Nicolabo
Eine andere Möglichkeit, es zu betrachten, ist das Schneiden aller zu plotenden Links und das Verwenden der Aktionsschaltfläche zum Aktualisieren des Diagramms, obwohl dies weniger interaktiv mit kleinen Daten, aber besserer Leistung und Ansicht für Daten mit einer großen Rechenzeit von bis zu 10s ist –