2015-04-14 37 views
9

Ich versuche, Bilder in meiner glänzenden App reaktiv anzuzeigen. Ich habe erfolgreich, dass in den server.R Skript mit getan:R Shiny: schnelle reaktive Bildanzeige

output$display.image <- renderImage({ 

    image_file <- paste("www/",input$image.type,".jpeg",sep="") 

    return(list(
     src = image_file, 
     filetype = "image/jpeg", 
     height = 520, 
     width = 696 
    )) 

    }, deleteFile = FALSE) 

aber es ist sehr langsam.

Allerdings ist es sehr schnell eines der Bilder in den Skript ui.R wie so einzubetten:

tabPanel("Live Images", img(src = "img_type1.jpeg")) 

Warum gibt es solch einen Unterschied? Gibt es eine Möglichkeit, die reaktiven Bilder schneller erscheinen zu lassen?

+0

Wenn Sie die Image-URL von der reaktiven senden, führen Sie eine Übertragung vom Server zum Client über JavaScript durch. Diese Daten müssen vom Client entpackt und zur Transformation des Dokuments verwendet werden, was Zeit kostet. Was sind Ihre Anforderungen? Muss das Bild dynamisch geladen werden? Gibt es eine begrenzte Anzahl von Bildern, die geladen werden können? – sdgfsdh

+0

@sdgfsdh Das Bild muss dynamisch basierend auf der Benutzereingabe (Eingabe $ image.type) geladen werden, und ja, es gibt eine endliche Menge von Bildern, die geladen werden können. – maia

Antwort

4

Hallo Sie conditionalPanel verwenden können, dies zu tun, es einbetten alle Ihre Bilder, sondern nur die eine, die TRUE auf den Zustand haben wird angezeigt:

tabPanel("Live Images", 
    conditionalPanel(condition = "input.image_type == 'img_type1'", 
         img(src = "img_type1.jpeg") 
    ), 
    conditionalPanel(condition = "input.image_type == 'img_type2'", 
         img(src = "img_type2.jpeg") 
    ) 
) 

Und den Namen Ihrer Eingabe image.type-image_type ändern weil . eine besondere Bedeutung in Javascript haben (wie zwischen input und image_type).

Wenn Sie viele Bilder haben, können Sie immer etwas tun:

tabPanel("Live Images", 
     lapply(X = seq_len(10), FUN = function(i) { 
      conditionalPanel(condition = paste0("input.image_type == 'img_type", i, "'"), 
          img(src = paste0("img_type", i, ".jpeg")) 
      ) 
     }) 
) 

Zum Beispiel mit Bildern aus dieser post von tsperry (Sie können es auf rbloggers finden), können Sie tun :

library("shiny") 
ui <- fluidPage(
    tabsetPanel(
    tabPanel("Live Images", 
     # 50 images to display 
     lapply(X = seq_len(50), FUN = function(i) { 
      # condition on the slider value 
      conditionalPanel(condition = paste0("input.slider == ", i), 
          # images are on github 
          img(src = paste0("https://raw.githubusercontent.com/pvictor/images/master/", 
              sprintf("%04d", i), "plot.png")) 
      ) 
     }), 
     sliderInput(inputId = "slider", label = "Value", min = 1, max = 50, value = 1, 
        animate = animationOptions(interval = 100, loop = TRUE)) 
    ) 
) 
) 

server <- function(input, output) { 

} 

shinyApp(ui = ui, server = server)