2017-04-14 3 views
0

Ich bin Fehler in meinem if-Anweisungen mit checkBoxGroupInput in meinem R Shiny App zu bekommen. Bitte ignorieren Sie die Tatsache, dass alle Diagramme, die ich ausgeben möchte, gleich sind - ich werde das später ändern. HierFehler in if-Anweisungen in R Shiny checkBoxGroupInput

ist der Code:

library(shiny) 
library(leaflet) 
library(DT) 
library(ggplot2) 
library(dplyr) 

r_colors <- rgb(t(col2rgb(colors())/255)) 
names(r_colors) <- colors() 

plotdata <- read.csv("C:/Users/Anatoly/Documents/Collatz/RenameLater/RenameLater/MapsAndSuch/RShinyCoral.csv") 
colnames(plotdata) <- c("Year1", "RLIMona", "Year2", "RLICatalina", "Year3", "RLILaParguera1998", "Year4", "RLILAPARGUERA2004") 
parguera <- read.csv("C:/Users/Anatoly/Documents/Collatz/RenameLater/RenameLater/MapsAndSuch/RShinyCoral.csv") 
parguera <- select(parguera, 5:8) 
colnames(parguera) <- c("Year", "1998 Expedition", "Year", "2004 Expedition") 
monaisland <- read.csv("C:/Users/Anatoly/Documents/Collatz/RenameLater/RenameLater/MapsAndSuch/RShinyCoral.csv") 
monaisland <- select(monaisland, 1:2) 
colnames(monaisland) <- c("Year", "Mona Island RLI") 
islacatalina <- read.csv("C:/Users/Anatoly/Documents/Collatz/RenameLater/RenameLater/MapsAndSuch/RShinyCoral.csv") 
islacatalina <- select(islacatalina, 3:4) 
colnames(islacatalina) <- c("Year", "Isla Catalina RLI") 



ui <- fluidPage(
    titlePanel("NOAA Coral Luminescence Data (RLI, 5-year Running Average)"), 
    leafletOutput("mymap"), 
    p(), 
    fluidRow(
    column(3, actionButton("laparguera", "La Parguera Data"), 
    actionButton("mona", "Mona Island Data"), 
    actionButton("isla", "Isla Catalina Data"))), 
    fluidRow(
    column(3, offset = 5, actionButton("visualize", "Visualize Data"))), 
    fluidRow(
    column(7, offset = 5, checkboxGroupInput("checkbox", "Add to plot", 
    c("La Parguera" = "La Parguera", "Mona Island" = "Mona Island", "Isla Catalina" = "Isla Catalina"))), 
    fluidRow(
    DT::dataTableOutput('tbl'), 
    plotOutput("plot1") 
) 
) 
) 
server <- function(input, output, session) { 

    output$mymap <- renderLeaflet({ 
    leaflet() %>% 
     addTiles() %>% 
     addMarkers(lat = 17.95, lng = - 67.05, popup = "La Parguera ") %>% 
     addMarkers(lat = 18.00, lng = -67.50, popup = "Mona Island") %>% 
     addMarkers(lat = 18.2, lng = -69.00, popup = "Isla Catalina") 
    }) 
    observeEvent(input$laparguera, { 
    output$tbl <- DT::renderDataTable(DT::datatable(parguera, options = list(pagelength = 25))) 
    }) 
    observeEvent(input$mona, { 
    output$tbl <- DT::renderDataTable(DT::datatable(monaisland, options = list(pagelength = 25))) 
    }) 
    observeEvent(input$isla, { 
    output$tbl <- DT::renderDataTable(DT::datatable(islacatalina, options = list(pagelength = 25))) 
    }) 
    observeEvent(input$visualize, { 
    output$plot1 <- renderPlot( 
    { 
    if (input$checkbox == c("Mona Island")) 
    { 
    gplot <- ggplot(data = plotdata) + 
    geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
     ylab("Candelas (5-year Running Average)") 
    print(gplot) 
    } 
    else if(input$checkbox == c("La Parguera", "Mona Island")) 
    { 
     gplot2 <- ggplot(data = plotdata) + 
     geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
     ylab("Candelas (5-year Running Average)") 
     print(gplot2) 
    } 
    else if (input$checkbox == c("La Parguera", "Mona Island", "Isla Catalina")) 
    { 
     gplot3 <- ggplot(data = plotdata) + 
     geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
     ylab("Candelas (5-year Running Average)") 
     print(gplot3) 
    } 
    else if(input$checkbox == c("Mona Island", "Isla Catalina")) 
    { 
     gplot4 <- ggplot(data = plotdata) + 
     geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
     ylab("Candelas (5-year Running Average)") 
     print(gplot4) 
    } 
    else if(input$checkbox == c("La Parguera", "Isla Catalina")) 
    { 
    gplot5 <- ggplot(data = plotdata) + 
     geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
     ylab("Candelas (5-year Running Average)") 
    print(gplot5) 
    } 
    else if(input$checkbox == c("Isla Catalina")) 
    { 
    gplot6 <- ggplot(data = plotdata) + 
     geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
     ylab("Candelas (5-year Running Average)") 
    print(gplot6) 
    } 
    else if(input$checkbox == c("La Parguera")) 
    { 
    gplot7 <- ggplot(data = plotdata) + 
     geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
     ylab("Candelas (5-year Running Average)") 
    print(gplot7) 
    } 
    else if(is.null(input$checkbox)) 
    { 
    print("Check some damn boxes") 
    } 

     }) 

}) 
} 

shinyApp(ui, server) 

Ich denke, das Problem ist, ich weiß nicht wirklich, welche Art von Eingabe-I aus dem Kontrollfeld zu bekommen. Ich nahm an, dass es ein Zeichenvektor war, aber ich bin mir nicht sicher, und die Dokumentation war nicht sehr hilfreich (zumindest für mich).

Danke.

Antwort

1

Bitte beachten Sie, dass ich es vorziehen, normalerweise einige Arbeits Code posten, aber dieses Mal habe ich nicht konnte, weil ich keinen Zugriff auf Ihre Daten haben: meine Entschuldigung.

Strukturelle Bewertung:

  • In checkboxGroupInput brauchen Sie nur einen einfachen Charakter Vektor, dh Sie müssen, ist nicht zu nennen Spalten usw.
    • Der resultierende input$checkbox ein anderes Zeichen Vektor
    • checkboxGroupInput ist so konzipiert, dass mehr als eine Eingabe gleichzeitig möglich ist, sodass die Ausgabe ein Vektor mit mehr als einem Eintrag sein kann.
    • (kleinere) Statt einer Kaskade von if Ich bevorzuge normalerweise Schalter (bearbeitet: aber es funktioniert nur für 1 Element Vergleiche), wie es den Code lesbarer macht (aber es ist persönlicher Geschmack).

In Ihrem Fall das Risiko von Fehlern zu verringern (oft aufgrund eines reaktiven Aufruf der Code mehr als einmal), in output$plot1 könnten Sie

cols <- isolate(input$checkbox) 

auch verwenden, anstatt die vorhandenen Code für output$plot1, könnten Sie eine observeEvent auf diese Weise beseitigen:

# snippet - not tested 
# 
# observeEvent(input$visualize, { # this is redundant 
    output$plot1 <- renderPlot( 
     if(is.null(input$visualize)) return() # this is all you need to make output$plot1 reactive to input$visualize 
     cols <- isolate(input$checkbox) 
     if (cols == c("Mona Island")) 
     { 

Die Verbreitung von Neste d reaktive Elemente ist nie eine gute Sache in glänzenden (unter anderem verursacht es unnötigerweise den Code wiederholt auszuführen, CPU-Zyklen zu brennen).

Wenn nützlich, ich mit checkboxGroupInput auf SO ein Codebeispiel vor kurzem veröffentlicht. Sehen Sie es here

Wenn Sie immer noch Fehler erhalten, würde ich vorschlagen, die Links zu veröffentlichen, um mir oder anderen zu erlauben, Ihre Daten zu erhalten und ein funktionierendes Beispiel zurückzuschicken.

Arbeitsbeispiel und "neue Kommentare"

library(shiny) 
library(leaflet) 
library(DT) 
library(ggplot2) 
library(dplyr) 

r_colors <- rgb(t(col2rgb(colors())/255)) 
names(r_colors) <- colors() 

plotdata <- read.csv("RShinyCoral.csv") 
colnames(plotdata) <- c("Year1", "RLIMona", "Year2", "RLICatalina", "Year3", "RLILaParguera1998", "Year4", "RLILAPARGUERA2004") 
parguera <- read.csv("RShinyCoral.csv") 
parguera <- select(parguera, 5:8) 
colnames(parguera) <- c("Year", "1998 Expedition", "Year", "2004 Expedition") 
monaisland <- read.csv("RShinyCoral.csv") 
monaisland <- select(monaisland, 1:2) 
colnames(monaisland) <- c("Year", "Mona Island RLI") 
islacatalina <- read.csv("RShinyCoral.csv") 
islacatalina <- select(islacatalina, 3:4) 
colnames(islacatalina) <- c("Year", "Isla Catalina RLI") 



ui <- fluidPage(
    titlePanel("NOAA Coral Luminescence Data (RLI, 5-year Running Average)"), 
    leafletOutput("mymap"), 
    p(), 
    fluidRow(
    column(3, actionButton("laparguera", "La Parguera Data"), 
      actionButton("mona", "Mona Island Data"), 
      actionButton("isla", "Isla Catalina Data")), 

    column(9, 
     actionButton("visualize", "Add to Plot"), 

     checkboxGroupInput("checkbox", label = NULL, 
              c("La Parguera", "Mona Island", "Isla Catalina")) 
    )), 
    fluidRow(column(6, DT::dataTableOutput('tbl')), 
    column(6, plotOutput("plot1")) 
    ) 
) 
server <- function(input, output, session) { 

    output$mymap <- renderLeaflet({ 
    leaflet() %>% 
     addTiles() %>% 
     addMarkers(lat = 17.95, lng = - 67.05, popup = "La Parguera ") %>% 
     addMarkers(lat = 18.00, lng = -67.50, popup = "Mona Island") %>% 
     addMarkers(lat = 18.2, lng = -69.00, popup = "Isla Catalina") 
    }) 
    observeEvent(input$laparguera, { 
    output$tbl <- DT::renderDataTable(DT::datatable(parguera, options = list(pagelength = 25))) 
    }) 
    observeEvent(input$mona, { 
    output$tbl <- DT::renderDataTable(DT::datatable(monaisland, options = list(pagelength = 25))) 
    }) 
    observeEvent(input$isla, { 
    output$tbl <- DT::renderDataTable(DT::datatable(islacatalina, options = list(pagelength = 25))) 
    }) 


    output$plot1 <- renderPlot({ 
    if(length(input$visualize) == 0) return() 
    isolate({ 
     if(length(input$checkbox) == 0) return() 
     incheckbox <- input$checkbox 
    }) # end isolate 
    if(length(incheckbox) == 1) { 
    switch(incheckbox, 
     "Mona Island"= { gplot <- ggplot(data = plotdata) + 
          geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
          ylab("Candelas (5-year Running Average)") 
         print(gplot) }, 
     "Isla Catalina"= { gplot6 <- ggplot(data = plotdata) + 
          geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
          ylab("Candelas (5-year Running Average)") 
         print(gplot6) }, 
     "La Parguera"= { gplot7 <- ggplot(data = plotdata) + 
          geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
          ylab("Candelas (5-year Running Average)") 
         print(gplot7) } 
         ) # end switch 
    } else if(length(incheckbox) == 2) { 
      if(all(c("La Parguera", "Mona Island") %in% incheckbox)) { 
       gplot2 <- ggplot(data = plotdata) + 
        geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
        ylab("Candelas (5-year Running Average)") 
       print(gplot2) 
      } else if(all(c("Mona Island", "Isla Catalina") %in% incheckbox)) { 
        gplot4 <- ggplot(data = plotdata) + 
        geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
        ylab("Candelas (5-year Running Average)") 
        print(gplot4) 
      } else if(all(c("La Parguera", "Isla Catalina") %in% incheckbox)) { 
        gplot5 <- ggplot(data = plotdata) + 
        geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
        ylab("Candelas (5-year Running Average)") 
        print(gplot5) 
       } 
     } else if (all(c("La Parguera", "Mona Island", "Isla Catalina") %in% incheckbox)) { 
        gplot3 <- ggplot(data = plotdata) + 
        geom_polygon(mapping = aes(x = Year1, y = RLIMona), na.rm = TRUE) + 
        ylab("Candelas (5-year Running Average)") 
        print(gplot3) 
      } 

    }) 


} 

shinyApp(ui, server) 

Der obige Code funktioniert für mich :)

Neben den Änderungen an der Benutzeroberfläche (hergestellt einen wenig aufgeräumter UI zu bekommen und sehen, was los war) Der Schlüssel ist die if Kaskade. berücksichtigen:

  • if funktioniert nur für ein Element. Wenn Sie einen Vektor der Länge> 1 mit einem anderen Vektor> 1 vergleichen, wird nur das erste übereinstimmende Element des ersten Vektors berücksichtigt.
  • Ich halte meinen Code nicht besonders elegant (ich schließe später nicht aus, bessere Ideen zu bekommen!), Aber es sollte funktionieren (bitte lassen Sie mich wissen, wenn es nicht tut).
  • Angenommen, Sie haben 3 Elemente ausgewählt. all(c("La Parguera", "Mona Island") %in% incheckbox) wäre immer wahr. Aus diesem Grund teile ich die Vergleiche derzeit nach Anzahl der Elemente (aber es gibt wahrscheinlich andere Alternativen, die andere set Operatoren wie setdiff verwenden).

    Bitte lassen Sie mich wissen, wenn es für Sie funktioniert.

+0

Vielen Dank für Ihre Hilfe. Ich bin leider immer noch nicht in der Lage, den Code zur Arbeit zu bringen. Ich versuche herauszufinden, wie ich Ihnen meine Daten senden kann. @Enzo – madhatter5

+0

Ich denke, das wird funktionieren: http://www.filedropper.com/shrynycoral – madhatter5

+0

Just verwaltet. Ich werde Sie auf dem Laufenden halten. – Enzo