2017-11-20 2 views
1

Im Folgenden finden Sie eine Demo des Codes, der in meiner glänzenden App verwendet wird - sie enthält alle wichtigen Elemente meiner vollständigen App und vor allem wird mein Problem reproduziert.Reaktive Codierung in R Shiny - Was verursacht diese Sekundenbruchteil-Fehlermeldungen?

Ein wichtiger Teil meiner glänzenden App ist, dass bestimmte Widgets nur erscheinen, wenn ein anderes Widget auf einen bestimmten Wert eingestellt ist. In diesem Fall ist der shotchart.input das Hauptwidget, und dann werden die Widgets playerseason.input und teamgame.input nur angezeigt, wenn der Wert für shotchart.input auf einen bestimmten Wert gesetzt ist. In meiner Benutzeroberfläche übergebe ich diese zweiten und dritten Widgets in den uiOutput() - Funktionen.

In meinem Server habe ich RenderUI-Funktionen für jedes dieser beiden Widgets. Die Dropdown-Optionen für diese Widgets hängen von einer bestimmten Filterung meines Hauptdatenrahmens ab (nicht in meinem Beispiel hier, sondern in meiner Hauptanwendung). Daher ist es wichtig, dass ich diese Widgets auf dem Server erstelle.

Mein Problem ist wie folgt - wenn ich die App starte, gibt es für einen Bruchteil einer Sekunde einen 'Nicht-Charakter-Argument' Fehler. Wenn ich dann den Wert des ersten Widgets in Shot Marker Graph (Team-Spiel) ändere, erhalte ich einen weiteren Sekundenbruchteil-Fehler. Dieses Mal muss das Ergebnis die Länge 20, nicht 0 haben.

Ich denke, das liegt daran, dass innerhalb meiner renderPlotly() Funktion, ich habe Zeilen Code wie folgt aus:

fname <- strsplit(input$player.id, split = ' ')[[1]][1] 

und für das andere Widget

this.t2 <- input$team.id 
all.pbp <- all.pbp %>% filter(team == this.t2) 

, die auf dem reaktiven verlassen Eingabeparameter geben $ player.id ein und geben $ team.id ein. Mein Gedanke ist, dass diese Eingabeparameter ~ 1 Sekunde benötigen, um einen Wert zu erhalten. Daher treten diese Fehler beim Starten der App und beim Umschalten des Haupt-Widgets schnell auf.

Diese Fehler sehen aus der Sicht des Benutzererlebnisses schlecht aus, und noch wichtiger, lassen Sie mich denken, dass ich renderUI und uiOutput hier nicht richtig verwende. Irgendwelche Gedanken darüber, wie man diese geteilten zweiten Fehlermeldungen/bessere Kodierungspraxis loswird, würden sehr geschätzt werden. Vielen Dank!

App unter:

# Pre-Processing 
all.pbp <- structure(list(team = c("BOS", "CLE", "BOS", "CLE", "BOS", "BOS", 
            "CLE", "CLE", "BOS", "CLE", "BOS", "CLE", "BOS", "CLE", "BOS", 
            "BOS", "CLE", "BOS", "BOS", "BOS"), lastname = c("Irving", "Rose", 
             "Hayward", "Love", "Tatum", "Horford", "Crowder", "Wade", "Brown", 
             "Rose", "Hayward", "Rose", "Irving", "Wade", "Irving", "Brown", 
             "Crowder", "Horford", "Brown", "Brown"), firstname = c("Kyrie", 
               "Derrick", "Gordon", "Kevin", "Jayson", "Al", "Jae", "Dwyane", 
               "Jaylen", "Derrick", "Gordon", "Derrick", "Kyrie", "Dwyane", 
               "Kyrie", "Jaylen", "Jae", "Al", "Jaylen", "Jaylen"), yloc = c(789L, 
                55L, 751L, 134L, 866L, 699L, 107L, 86L, 883L, 62L, 798L, 296L, 
                858L, 66L, 768L, 873L, 309L, 667L, 748L, 876L), xloc = c(251L, 
                  232L, 464L, 119L, 240L, 203L, 467L, 133L, 261L, 245L, 259L, 346L, 
                  257L, 398L, 141L, 248L, 197L, 133L, 468L, 255L)), .Names = c("team", 
                 "lastname", "firstname", "yloc", "xloc"), class = "data.frame", row.names = c(NA, 20L)) 

shotchart.types <- c('Shot Marker Graph (Player-Season)', 'Shot Marker Graph (Team-Game)') 
names(shotchart.types) <- shotchart.types 

# The UI 
ui <- fluidPage(fluidRow(
        column(width = 3, align = 'center', 
         h3('Chart Type'), hr(), 

         # create permanent input for shot chart type (should be 5 options) 
         selectInput(inputId = 'shotchart.input', label = 'Select Shot Chart Type:', multiple = FALSE, 
            choices = shotchart.types, selected = 'Shot Marker Graph (Player-Season)'), 

         uiOutput('playerseason.input'), 
         uiOutput('teamgame.input') 
         ), 

        # 2.C Launch the Chart 
        # ===-===-===-===-===-=== 
        column(width = 8, align = 'left', 
         plotlyOutput("shotplot") 
       ) 
       ) 
) 


# The Server 
server <- shinyServer(function(input, output) { 

    # 3.A widgets whose appearance is conditional on another widget value 
    # ===-===-===-===-===-===-===-===-===-===-===-===-===-===-===-===-===-=== 
    # select player for player-season graph 
    output$playerseason.input <- renderUI({ 
    if(input$shotchart.input == 'Shot Marker Graph (Player-Season)') { 

     all.players <- unique(paste(all.pbp$firstname, all.pbp$lastname)) 
     names(all.players) <- all.players 

     selectInput(inputId = 'player.id', label = 'Select Player:', multiple = FALSE, 
        choices = all.players, selected = 'Kyrie Irving') 
    } else{ 
     return(NULL) 
    } 
    }) 

    # select team for team-game graph 
    output$teamgame.input <- renderUI({ 
    if(input$shotchart.input == 'Shot Marker Graph (Team-Game)') { 

     all.teams <- unique(all.pbp$team) 
     names(all.teams) <- all.teams 

     selectInput(inputId = 'team.id', label = 'Select Team:', multiple = FALSE, 
        choices = all.teams, selected = 'BOS') 

    } else{ 
     return(NULL) 
    } 
    }) 

    # 3.B The Plot 
    # ===-===-===-=== 
    output$shotplot <- renderPlotly({ 

    # first plot, based on chart type widget 
    if(input$shotchart.input == 'Shot Marker Graph (Player-Season)') { 

     fname <- strsplit(input$player.id, split = ' ')[[1]][1] 
     lname <- strsplit(input$player.id, split = ' ')[[1]][2] 
     all.pbp <- all.pbp %>% filter(firstname == fname, lastname == lname) 
     print(fname); 
     print(lname); 
     print(all.pbp); 

     plot_ly(all.pbp) %>% 
     add_trace(x = ~xloc, y = ~yloc, type = 'scatter', mode = 'markers') 
    } 

    # second plot, also based on chart type widget 
    else if(input$shotchart.input == 'Shot Marker Graph (Team-Game)') { 

     this.t2 <- input$team.id 
     all.pbp <- all.pbp %>% filter(team == this.t2)  

     plot_ly(all.pbp) %>% 
     add_trace(x = ~xloc, y = ~yloc, type = 'scatter', mode = 'markers') 
    } 

    }) 
}) 

shinyApp(ui, server) 
+1

fand ich die Lösung von Joe Cheng hilfreich, um das Rendering zu verzögern, bis die App geladen ist: https://stackoverflow.com/questions/20490619/delayed-execution-in-r-shiny-app –

+0

er nutzt Die reactiveValues ​​() -Funktion, aber ich nicht - ist das der Vorschlag, den Sie machen? Das OP von diesem Link verwendet auch bedingte Panels, während ich stattdessen renderUI und uiOutput verwende. – Canovice

+1

Ich denke, der Kontext ist irrelevant. Die reactiveValues ​​wird aktualisiert, während die Session $ onflush ist und verhindert, dass die Renderfunktion ausgeführt wird. Hoffentlich reicht das, damit Ihr renderUI ohne Fehler läuft. –

Antwort

1

Hallo dieses Problem aus der dynamischen Wiedergabe der Eingabefelder stehen vor der Tür. Sie werden nicht beim ersten Berechnen des Plots ausgelöst. Aber sobald sie initiiert werden, wird die Handlung neu berechnet und alles funktioniert gut.

Shiny hat die Funktion req nur für diesen Zweck hier können Sie testen, ob eine Variable truthy ist, d. H. Einen Wert hat. wenn nicht, werden die Berechnungen mit einer stillen Warnung abgebrochen. So würde es in Ihrem Fall funktionieren. Ich habe gerade die req() an zwei Stellen hinzugefügt und es funktioniert gut.

server <- shinyServer(function(input, output) { 

    # 3.A widgets whose appearance is conditional on another widget value 
    # ===-===-===-===-===-===-===-===-===-===-===-===-===-===-===-===-===-=== 
    # select player for player-season graph 
    output$playerseason.input <- renderUI({ 
    if(input$shotchart.input == 'Shot Marker Graph (Player-Season)') { 

     all.players <- unique(paste(all.pbp$firstname, all.pbp$lastname)) 
     names(all.players) <- all.players 

     selectInput(inputId = 'player.id', label = 'Select Player:', multiple = FALSE, 
        choices = all.players, selected = 'Kyrie Irving') 
    } else{ 
     return(NULL) 
    } 
    }) 

    # select team for team-game graph 
    output$teamgame.input <- renderUI({ 
    if(input$shotchart.input == 'Shot Marker Graph (Team-Game)') { 

     all.teams <- unique(all.pbp$team) 
     names(all.teams) <- all.teams 

     selectInput(inputId = 'team.id', label = 'Select Team:', multiple = FALSE, 
        choices = all.teams, selected = 'BOS') 

    } else{ 
     return(NULL) 
    } 
    }) 

    # 3.B The Plot 
    # ===-===-===-=== 
    output$shotplot <- renderPlotly({ 

    # first plot, based on chart type widget 
    if(input$shotchart.input == 'Shot Marker Graph (Player-Season)') { 
     req(input$player.id) 
     fname <- strsplit(input$player.id, split = ' ')[[1]][1] 
     lname <- strsplit(input$player.id, split = ' ')[[1]][2] 
     all.pbp <- all.pbp %>% filter(firstname == fname, lastname == lname) 
     print(fname); 
     print(lname); 
     print(all.pbp); 

     plot_ly(all.pbp) %>% 
     add_trace(x = ~xloc, y = ~yloc, type = 'scatter', mode = 'markers') 
    } 

    # second plot, also based on chart type widget 
    else if(input$shotchart.input == 'Shot Marker Graph (Team-Game)') { 
     req(input$team.id) 

     this.t2 <- input$team.id 
     all.pbp <- all.pbp %>% filter(team == this.t2)  

     plot_ly(all.pbp) %>% 
     add_trace(x = ~xloc, y = ~yloc, type = 'scatter', mode = 'markers') 
    } 

    }) 
}) 
+0

MEIN HELD vielen Dank – Canovice

Verwandte Themen