2015-04-14 246 views
9

我試圖在我的閃亮應用程序中反應顯示圖像。我已經成功地做到了在server.R腳本:R Shiny:快速反應圖像顯示

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) 

但它很慢

然而,非常快嵌入圖像的一成ui.R腳本,像這樣:

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

爲什麼會有這樣的區別?有沒有辦法讓反應圖像顯得更快?

+0

當您從反應者發送圖像URL時,您正在通過JavaScript從服務器向客戶端進行傳輸。這些數據需要由客戶端解壓縮並用於轉換文檔,這都需要時間。你有什麼要求?圖像是否需要動態加載?是否有可能加載的有限圖像集? – sdgfsdh

+0

@sdgfsdh需要根據用戶輸入(輸入$ image.type)動態加載圖像,並且是有可以加載的一組有限的圖像。 – maia

回答

4

嗨,你可以使用conditionalPanel要做到這一點,它嵌入所有圖像,但只有一個具有TRUE的狀態將顯示:

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

而且從image.type改變你輸入的名稱image_type因爲.在Javascript中有特殊含義(如inputimage_type之間)。

如果你有大量的圖片,你總是可以做這樣的事情:通過tsperry

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

例如,對於圖片來自此post(你可以找到它的rbloggers太),你可以做:

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)