Sehe den Fehler nicht

Alles über shiny web applicationen und plumber APIs

Moderatoren: EDi, jogo

Antworten
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Sehe den Fehler nicht

Beitrag von retep »

Hallo,

ich hoffe, das ich nochmals Hilfe finde. Ich bin mal wieder mit Shiny unterwegs und wollte eigentlich nur einen simplen x,y Plot programmieren. Leider zickt Shiny wieder rum und zeigt mir ein Fehler an, wo ich ziemlich verblüfft bin! Denn ich sehe ja das die betreffende Spalte vorhanden ist. Hier der Code:

Code: Alles auswählen

# original data
library(tidyverse)
library(plotly)
library(shiny)
library(readr)
# import data
Sample <- read_delim("Sample.txt", delim = "\t", 
                     escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
# make the long version
df = Sample%>%
  pivot_longer(
    cols = Si: Ca,
    names_to = "Element",
    values_to = "Value")

ui <- fluidPage(
  titlePanel(title = h2(" Shiny", align = "left")),
  # left sidebar
  sidebarLayout(position = "left", fluid = TRUE, 
                sidebarPanel(
                  titlePanel("Core Data"), 
                  
                                   # Depth Plot
                                   # input site
                                   selectInput("sites", "Site", 
                                               choices = unique(df$Number), multiple = TRUE),
                                   br(),
                                   # choose a element
                                   pickerInput(
                                     inputId = "el", 
                                     label = "Select element",
                                     choices = unique(df$Element),
                                     selected = NULL,
                                     multiple = FALSE,
                                     options = pickerOptions(
                                       actionsBox = TRUE,
                                       title = "Please select a item",
                                       header = "Elements")),
                  ),
                
                # end sidebar
               
                              
                              
                              # main panel
                              mainPanel(
                             # Depth Plot
                             tabPanel("Depth Plot",
                             plotlyOutput("dplot", height= 800, width = 1150)))
                              # end of main panel
  
))



server <- function(input, output, session){
  
  ## filter element
  ## Depth Plot
  # fixed x value for depth plot
  # depth plot
  reactivedepth <- reactive({
    
    df%>%
      filter(Element %in% input$el%>%
             Number %in% input$site)
  })
  
  
  
  output$dplot <- renderPlotly({ 
    # draw the plot
    ggplotly(
      ggplot(reactivedepth (), x = Depth, y = Value, color = Element)) +
      #geom_line() + 
      geom_point(colour=("grey60"))+
      coord_flip()+
      scale_x_reverse(limits = c(2.5, 0), 
                      breaks = seq(2.5, 0, by = -0.1))+
      # make the wraps
      facet_wrap(. ~ Number, scales = 'free_x', nrow = 1)+
      # select a method 
      stat_smooth(method=loess)
      # design the graphic
      theme_ipsum(base_size = 15) +
      theme(axis.text.x=element_text(size=rel(0.8)))
    
  })
  
  
}

shinyApp(ui, server)


Im Anhang ist der zugehörige Beispiel Datensatz und ein Beispiel Plot. Das Ziel ist es wie im Beispiel gezeigt, per Mauslick verschiedene Standorte zu definieren und ein dazugehöriges Element plotten zu lassen. Die gezeigten Daten sind Dummies, also keine echten Daten.

Beim Auflösen des Shiny Codes bekomme ich folgende Fehlermeldung:
Problem while computing `..1 = Element %in% input$el %>% Number %in% input$site`.
Eigentlich wollte ich noch ein Screenshot anhängen - geht leider nicht! :-/ Meine Frage lautet, wieso taucht dieser Fehler auf, wenn ich doch sehe, dass die betreffende Spalte vorhanden ist. Wahrscheinlich habe ich Tomaten auf den Augen!

Freue mich über jeden Lösungsvorschlag und vielen Dank vorab!
Dateianhänge
Sonde.png
Sample.txt
(23.02 KiB) 120-mal heruntergeladen
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Sehe den Fehler nicht

Beitrag von EDi »

Code: Alles auswählen

      filter(Element %in% input$el%>%
             Number %in% input$site)
Die Fehlermeldung weißt doch auf das Problem hin:
Was soll denn der pipe-operator hier machen?

Ich vermute du möchtest eher einen logischen Operator haben, z.B. ?`&`...
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: Sehe den Fehler nicht

Beitrag von retep »

Hallo Edi,

ja natürlich! Das war ein Fehler! Ziemlich leichtsinnig - sorry! Fehler ausgebügelt! Hier die Korrektur!:

Code: Alles auswählen

# original data
library(tidyverse)
library(plotly)
library(shiny)
library(readr)
# import data
Sample <- read_delim("Sample.txt", delim = "\t", 
                     escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
# make the long version
df = Sample%>%
  pivot_longer(
    cols = Si: Ca,
    names_to = "Element",
    values_to = "Value")

ui <- fluidPage(
  titlePanel(title = h2(" Shiny", align = "left")),
  # left sidebar
  sidebarLayout(position = "left", fluid = TRUE, 
                sidebarPanel(
                  titlePanel("Core Data"), 
                  
                  # Depth Plot
                  # input site
                  selectInput("sites", "Site", 
                              choices = unique(df$Number), multiple = TRUE),
                  br(),
                  # choose a element
                  pickerInput(
                    inputId = "el", 
                    label = "Select element",
                    choices = unique(df$Element),
                    selected = NULL,
                    multiple = FALSE,
                    options = pickerOptions(
                      actionsBox = TRUE,
                      title = "Please select a item",
                      header = "Elements")),
                ),
                
                # end sidebar
                
                
                
                # main panel
                mainPanel(
                  # Depth Plot
                  tabPanel("Depth Plot",
                           plotlyOutput("dplot", height= 800, width = 1150)))
                # end of main panel
                
  ))



server <- function(input, output, session){
  
  ## filter element
  ## Depth Plot
  # fixed x value for depth plot
  # depth plot
  reactivedepth <- reactive({
    
    df%>%
      filter(Element %in% input$el,
               Number %in% input$site)
  })
  
  
  
  output$dplot <- renderPlotly({ 
    # draw the plot
    ggplotly(
      ggplot(reactivedepth (), x = Depth, y = Value, color = Element)) +
      #geom_line() + 
      geom_point(colour=("grey60"))+
      coord_flip()+
      scale_x_reverse(limits = c(2.5, 0), 
                      breaks = seq(2.5, 0, by = -0.1))+
      # make the wraps
      facet_wrap(. ~ Number, scales = 'free_x', nrow = 1)+
      # select a method 
      stat_smooth(method=loess)
    # design the graphic
    theme_ipsum(base_size = 15) +
      theme(axis.text.x=element_text(size=rel(0.8)))
    
  })
  
  
}

shinyApp(ui, server)


Jetzt bekommen ich folgende Fehlermeldung:
Warning: Error in UseMethod: no applicable method for 'ggplotly' applied to an object of class "c('theme', 'gg')"
104: ggplotly
102: plotly_build.gg
98: getFromNamespace("prepareWidget", "plotly")
97: shinyRenderWidget
96: func
83: renderFunc
82: output$dplot
1: runApp
Warning: Error in UseMethod: no applicable method for 'ggplotly' applied to an object of class "c('theme', 'gg')"
104: ggplotly
102: plotly_build.gg
98: getFromNamespace("prepareWidget", "plotly")
97: shinyRenderWidget
96: func
83: renderFunc
82: output$dplot
1: runApp
Verstehe ich nicht! in einer anderen Shiny App, läuft ein ähnlicher Code - Tiefenplot anstandslos durch! :shock:

Vielleict darf ich nochmals um Durchsicht und mögliche Fehlerkorrektur bitten?

Vielen Dank!

retep
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Sehe den Fehler nicht

Beitrag von EDi »

Vielleict darf ich nochmals um Durchsicht und mögliche Fehlerkorrektur bitten?
Meine statische Code Analyse (bin zu faul das laufen zu lassen), zusammen mit der Fehlermeldung zeigt dass hier

Code: Alles auswählen

      # select a method 
      stat_smooth(method=loess)
    # design the graphic
    theme_ipsum(base_size = 15) +
ein '+' fehlt.

Lass die (IMO unnötigen, weil sie die Funktion beschreiben, das sieht man ja aber auch aus dem code) Kommentare weg und achte auf deinen Code-stil (z.b. Einrückung und Leerzeichensetzung. Siehe z.B. auch https://style.tidyverse.org/) - dann erkennst du solche Fehler einfacher.

Bei solchen Fehlern kann man sich auch selbst behelfen:
Einfach ein

Code: Alles auswählen

browser()
in / vor das Codestück in dem man den Fehler vermutet setzen.
Dann geht es in den interaktiven modus und man kann manuell sich umschauen / weiterlaufen lassen.
Mehr info z.b. hier: https://adv-r.hadley.nz/debugging.html
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: Sehe den Fehler nicht

Beitrag von retep »

Hallo Edi,

ich habe das Skript nochmals überarbeitet:

Code: Alles auswählen

# original data
library(tidyverse)
library(plotly)
library(shiny)
library(readr)
# import data
Sample <- read_delim("Sample.txt", delim = "\t", 
                     escape_double = FALSE, trim_ws = TRUE, show_col_types = FALSE)
# make the long version
df = Sample%>%
  pivot_longer(
    cols = Si: Ca,
    names_to = "Element",
    values_to = "Value")

ui <- fluidPage(
  titlePanel(title = h2(" Shiny", align = "left")),
  # left sidebar
  sidebarLayout(position = "left", fluid = TRUE, 
                sidebarPanel(
                  titlePanel("Core Data"), 
                  
                  # Depth Plot
                  # input site
                  selectInput("sites", "Site", 
                              choices = unique(df$Number), multiple = TRUE),
                  br(),
                  # choose a element
                  pickerInput(
                    inputId = "el", 
                    label = "Select element",
                    choices = unique(df$Element),
                    selected = NULL,
                    multiple = FALSE,
                    options = pickerOptions(
                      actionsBox = TRUE,
                      title = "Please select a item",
                      header = "Elements")),
                ),
                
                # end sidebar
                
                
                
                # main panel
                mainPanel(
                  # Depth Plot
                  tabPanel("Depth Plot",
                           plotlyOutput("dplot", height= 800, width = 1150)))
                # end of main panel
                
  ))



server <- function(input, output, session){
  
    reactivedepth <- reactive({
    
    df%>%
      filter(Element %in% input$el,
             Number %in% input$site)
  })
  
  
  
  output$dplot <- renderPlotly({ 
    # draw the plot
    ggplotly(
      ggplot(reactivedepth (), x = Depth, y = Value, color = Element)) +
      #geom_line() + 
      geom_point(colour=("grey60"))+
      coord_flip()+
      scale_x_reverse(limits = c(2.5, 0), 
                      breaks = seq(2.5, 0, by = -0.1))+
     facet_wrap(. ~ Number, scales = 'free_x', nrow = 1)+
     stat_smooth(method=loess)+
      theme_ipsum(base_size = 15) +
      theme(axis.text.x=element_text(size=rel(0.8)))
    
  })
  
  
}

shinyApp(ui, server)


Jetzt kommt überhaupt keine Reaktion! Keine Fehlermeldung kein Plot! :(
Die Webseite schaue ich mir nochmal an.

Vielleicht darf ich dich bitten nochmal drüber zu gucken?

Vielen Dank für deine Geduld & Verständnis.
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Sehe den Fehler nicht

Beitrag von EDi »

Dein Beispiel wird nicht laufen,
weil du Funktionen aus Paketen nutzt die du nicht deklariert hast (z.B. shinyWidgets::pickerInput).
Deswegen lass ich es erst gar nicht laufen...

Pro-Tipp: sei explizit mit deinen Funktionen & nutze paket::funktion()...


Zu deinem Problem:

Code: Alles auswählen

ggplotly( ggplot(reactivedepth (), x = Depth, y = Value, color = Element)) +
Hier ist etwas zu viel und hier

Code: Alles auswählen

theme(axis.text.x=element_text(size=rel(0.8)))
    
  })
  

zu wenig.

Pro-Tipp: Nutze Einrückung und Rücke schließende Klammern passend ein um schnell eine Überblick über Klammern zu haben.

Ordentlicher Code-Stil zahlt sich aus...
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: Sehe den Fehler nicht

Beitrag von retep »

Hallo Edi,

vielen Dank für deine Mühe!

EDi hat geschrieben: Do Mai 19, 2022 10:54 pm Dein Beispiel wird nicht laufen,
weil du Funktionen aus Paketen nutzt die du nicht deklariert hast (z.B. shinyWidgets::pickerInput).
Deswegen lass ich es erst gar nicht laufen...

Pro-Tipp: sei explizit mit deinen Funktionen & nutze paket::funktion()...



Zu deinem Problem:

Code: Alles auswählen

ggplotly( ggplot(reactivedepth (), x = Depth, y = Value, color = Element)) +
Hier ist etwas zu viel und hier

Code: Alles auswählen

theme(axis.text.x=element_text(size=rel(0.8)))
    
  })
  

zu wenig.

Pro-Tipp: Nutze Einrückung und Rücke schließende Klammern passend ein um schnell eine Überblick über Klammern zu haben.

Ordentlicher Code-Stil zahlt sich aus...
Habe den Code so korrigiert wie du vorschlägst - leider kein Erfolg. :|

Trotz deiner Korrektur - das Beispiel funktioniert auch so nicht! Es gibt keine Fehlermeldung - nichts! Trotz Aktivierung von ShinyWidgets.....

Einen ähnlichen Plot mit nur einem Filter hat in einem anderen Shiny Projekt problemlos funktioniert. Diese Mini Shiny App benutze ich mittlerweile sehr oft!

Aktuell, benutze ich zwei Filter - ein Filter nach dem Standort und Filter zwei nach dem Element. Die Tiefe ist fix. Deswegen kein Filter für die Tiefe. Ich störe mich vor allem an der fehlenden Fehlermeldung - und an der kompletten Nichtreaktion! Es gibt einfachh kein Plot - keine Reaktion!



Vielleicht darf ich nochmals um Hilfe bitten.....????
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: Sehe den Fehler nicht

Beitrag von retep »

Hallo Edi,

Jetzt läufts.....Irre!

selbst beim Kopieren habe ich einen Fehler gemacht :D Ich hatte selbst auf deinen korrekten Hinweis mit dem Klammer setzen nicht darauf gehört. Das kommt davon, wenn Verzweiflung im Spiel ist.

Beim Anwenden des Paramaters stat_smooth kommt zwar noch ein Fehler:
Warning: Error in combine_vars: Faceting variables must have at least one value
Aber das bekomme ich auchh noch raus. Der Plot als solches läuft jetzt durch!

Vielen Dank für deine Mühe & Hilfsbereitschaft

retep
Antworten