2015-04-14 15 views
9

Sto provando a visualizzare le immagini nella mia app lucida in modo reattivo. Ho fatto con successo che nel sceneggiatura server.R con:R lucido: visualizzazione rapida dell'immagine reattiva

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) 

ma è molto lento .

Tuttavia, è molto veloce per incorporare una delle immagini nella sceneggiatura ui.R in questo modo:

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

Perché c'è una tale differenza? C'è un modo per rendere più veloci le immagini reattive?

+0

Quando si invia l'URL dell'immagine dal reattivo, si sta effettuando un trasferimento dal server al client tramite JavaScript. Questi dati devono essere decompressi dal client e utilizzati per trasformare il documento, il tutto richiede tempo. Quali sono i tuoi requisiti? L'immagine deve essere caricata dinamicamente? Esiste un insieme finito di immagini che potrebbero essere caricate? – sdgfsdh

+0

@sdgfsdh L'immagine deve essere caricata dinamicamente in base all'input dell'utente (input $ image.type), e sì c'è un insieme finito di immagini che possono essere caricate. – maia

risposta

4

Hi è possibile utilizzare conditionalPanel a fare questo, incorporare tutte le immagini, ma solo quello che hanno verrà visualizzato TRUE alla condizione:

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") 
    ) 
) 

e cambiare il nome del vostro input image.type-image_type perché . ha un significato speciale in Javascript (come tra input e image_type).

Se si dispone di un sacco di immagini, si può sempre fare qualcosa di simile:

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")) 
      ) 
     }) 
) 

Ad esempio, con immagini di questo post da tsperry (si può trovare su rbloggers troppo), si può fare :

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)