2016-07-16 4 views
0

EDIT NULL sein: Ok, ich habe ein Problem etwas zu lösen und das Problem ist nicht in der if(boolean) Aussage, es ist eigentlich in meiner filter() Anweisung innerhalb der if() Aussage:Shiny: if-Anweisung mit Eingangsgröße in server.R könnte

bar_mcgun <- bar_mcgun %>% filter(region == input$area)

input$area kehrt NULL. area ist eine inputid Variable in der folgenden renderUI() Aussage:

output$region <- renderUI({ 
    selectInput(inputId = "area", label = "Choose a region:", choices = c("Midwest", "Northeast", 
     "South Central", "South Atlantic", "West"), selected = "Northeast") 
}) 

Es scheint, dass input$area aus irgendeinem Grund verborgen ist. Bitte helfen Sie.

Ich bekomme auch die folgende Fehlermeldung, wenn ich versuche input$location zu nennen:

Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)


ich aus RStudio schon seit den letzten 3 Stunden gekickt versuchen, eine App zu laufen. Ich bin ziemlich sicher, dass der Fehler etwas mit der Verbindung zwischen dem radioButtons() in meiner ui.R-Datei und dem if-statements in meiner server.R-Datei zu tun hat.

Ich überprüfte meine Protokolldatei und ich sehe 'Null ist kein Objekt'. Ich isolierte den Code, um zu überprüfen, ob es einen Fehler mit read.csv2 und den folgenden Datenmanipulationen gab, aber alles zeigt sich.

Bitte lassen Sie es mich wissen, wenn Sie eine Idee haben, woher die 'Null' kommt.

ui.R

shinyUI(fluidPage(
    titlePanel("McGun"), 

sidebarLayout(
    sidebarPanel(
     helpText("Look at number of Gundealers, McDonald's, hospitals, and/or Population of states by region:"), 

     radioButtons('view', 'View U.S.A data according to state or region:', c('states', 'regions'), 'regions'), 

     conditionalPanel(
     "input.view == 'states'", 
     uiOutput('state') 
    ), 

     conditionalPanel(
     "input.view == 'regions'", 
     uiOutput('region') 
    ), 

     checkboxGroupInput("data", 
        label = "Data of interest:", 
        c('population','gundealers', "mcdonalds", 'hospitals'), 
        c('population','gundealers', "mcdonalds", 'hospitals')), 

     selectInput('pop', 'Population by:', c('1000', '10000', '100000'), '10000') 

    ), 

    mainPanel(
     plotOutput('barplot') 
    ) 
) 
)) 

server.R

mcgun <- read.csv2("data/mcgun.csv2") 
library(ggplot2) 
library(dplyr) 
library(reshape2) 
location <- state.abb 
location[51] <- 'DC' 
location <- sort(location) 

shinyServer(function(input, output) { 

    output$state <- renderUI({ 
    selectInput(inputId = 'location',label = 'Choose a state:', choices = location, selected = location[1]) 
    }) 


    output$region <- renderUI({ 
    selectInput(inputId = "area", label = "Choose a region:", choices =   c("Midwest", "Northeast", 
       "South Central", "South Atlantic", "West"), selected = "Northeast") 
    }) 

    output$barplot <- renderPlot({ 

    scale_mcgun <- mcgun %>% mutate(population = round(population/as.integer(input$pop))) 
    scale_mcgun <- melt(scale_mcgun, id.vars = c('state', 'region')) 
    scale_mcgun <- scale_mcgun %>% arrange(state, variable) 

    if(is.null(input$data)==T){return()} 

    bar_mcgun <- data.frame() 
    for(i in 1:length(input$data)){bar_mcgun <- rbind(bar_mcgun, filter(scale_mcgun, variable == input$data[i]))} 

    if(input$view == 'regions'){ 

     bar_mcgun <- bar_mcgun %>% filter(region == input$area) 

     ggplot(bar_mcgun, aes(state, value, fill = as.factor(variable))) + 
     geom_bar(stat = 'identity', position = 'dodge') 
    } 

    if(input$view == 'states'){ 

     bar_mcgun <- bar_mcgun %>% filter(state == input$location) 

     ggplot(bar_mcgun, aes(state, value, fill = as.factor(variable))) + 
     geom_bar(stat = 'identity', position = 'dodge') 

    } 
    }) 

}) 

Vielen Dank für Ihre Zeit.

+0

Könnte es sein, dass die Rückkehr() verwendet eine NULL zu plotOutput Retuns ('BarPlot'). Gibt es mehr Kontext in Ihrer Protokolldatei? –

+0

Ich bin mir ziemlich sicher, dass 'return()' nur ein leeres 'mainPanel()' zurückgibt. Ich habe es dort eingefügt, für den Fall, dass keines der Kontrollkästchen angeklickt wurde. – beemyfriend

+0

Ich verstehe auch nicht, wie man Log-Dateien liest, es war sehr groß und ich habe noch nie zuvor eine Log-Datei angeschaut. Die einzige Information, die herausragte, war Java: Null ist kein Objektfehler – beemyfriend

Antwort

0

Ok, mein Problem war zweifach: Ich habe keine reaktiven Aussagen verwendet und reaktive Aussagen mit dplyr gemacht.

Zum Beispiel:

output$region <- renderUI({ 
    selectInput(inputId = "area", label = "Choose a region:", choices = c("Midwest", "Northeast", 
     "South Central", "South Atlantic", "West"), selected = "Northeast") 
}) 

Da die selectInput() Funktion innerhalb der renderUI() Funktion ist, die erstere ist nun eine reaktive Funktion. Diese neue Reaktivität bedeutet, dass ich input$area nicht mehr wie gewohnt anrufen kann. ich muss jetzt eine separate reaktive variabel machen, und rufen Sie dann die Variable als Funktion:

area <- reactive({ input$area }) 
area() #will equal input$area 

Die zweite Ausgabe reaktive Variablen in der dplyr filter() Funktion wurde. Offensichtlich gibt es einen Konflikt zwischen den beiden seit shiny und dplyr nicht-Standard-Formate verwenden. Ich denke, es gibt eine Möglichkeit, diesen Konflikt zu lösen, aber ich konnte es einfach nicht verstehen und nahm die faule Wurzel, indem ich einfach dplyr löste und die Filtermethode base verwendete.

Prost.

ui.

R
shinyUI(fluidPage(
    titlePanel("McGun"), 

    sidebarLayout(
    sidebarPanel(
     helpText("Look at number of Gundealers, McDonald's, Hospitals, and/or Population of states either individually or by region:"), 

     radioButtons('view', 'View U.S.A data according to state or region:', c('states', 'regions'), 'regions'), 

     conditionalPanel(
     "input.view == 'states'", 
     uiOutput('state') 
    ), 

     conditionalPanel(
     "input.view == 'regions'", 
     uiOutput('region') 
    ), 

     checkboxGroupInput("data", 
        label = "Data of interest:", 
        c('population','gundealers', "mcdonalds", 'hospitals'), 
        c('population','gundealers', "mcdonalds", 'hospitals')), 

     selectInput('pop', 'Population by:', c('1000', '10000', '100000'), '10000') 

    ), 

    mainPanel(
     plotOutput('barplot') 
    ) 
) 
)) 

server.R

mcgun <- read.csv2("data/mcgun.csv2") 
library(ggplot2) 
library(dplyr) 
library(reshape2) 
location <- sort(c(state.abb, 'DC')) 

shinyServer(function(input, output) { 

    output$state <- renderUI({ 
    selectInput(inputId = 'location',label = 'Choose a state:', choices = location, selected = location[1]) 
    }) 

    output$region <- renderUI({ 
    selectInput(inputId = "area", label = "Choose a region:", choices = c("Midwest", "Northeast", 
       "South Central", "South Atlantic", "West"), selected = "Northeast") 
    }) 

    output$barplot <- renderPlot({ 
    scale_mcgun <- mcgun %>% mutate(population = round(population/as.integer(input$pop))) 
    scale_mcgun <- melt(scale_mcgun, id.vars = c('state', 'region')) 
    scale_mcgun <- scale_mcgun %>% arrange(state, variable) 

    if(is.null(input$data)==T){return()} 
    bar_mcgun <- data.frame() 
    for(i in 1:length(input$data)){bar_mcgun <- rbind(bar_mcgun, filter(scale_mcgun, variable == input$data[i]))} 

    stateorregion <- reactive({ input$view }) 

    if(stateorregion() == 'regions'){ 
     area <- reactive({ input$area }) 
     ismatch <- bar_mcgun[,2] == area() 
     bar_mcgun <- bar_mcgun[ismatch,] 

    } 

    if(stateorregion() == 'states'){ 
     location <- reactive({ input$location }) 
     ismatch <- bar_mcgun[,1] == location() 
     bar_mcgun <- bar_mcgun[ismatch,] 

    } 

    ggplot(bar_mcgun, aes(state, value, fill = as.factor(variable))) + 
     geom_bar(stat = 'identity', position = 'dodge') 

    }) 

})