2015-05-21 2 views
0

В одном из моих приложений отображается ggplot через uiOutput('plot.ui'), а plot.ui отображается через renderUI().laggy Shiny uiOutput

output$plot.ui=renderUI({ 
    plotOutput('plot', width=a function(), height=a function()) 
    }) 

Код работает, но он очень лаги. Кажется, что это двухэтапный процесс. В моем приложении он сначала отображает «график» (который является ggplot, отображаемым renderPlot), затем он изменяет размер сюжета в соответствии с указанной шириной и высотой. Задержка между двумя шагами значительна (около 3 секунд). Я проверил его, обернув withProgress() вокруг plotOutput(), и проблема все еще существует. Мне интересно, почему эта проблема существует, и если есть какой-либо способ ее решения.

Приведенный небольшой пример прилагается для иллюстрации этой проблемы.

library(shiny) 
shinyApp(
    ui=shinyUI(
    pageWithSidebar(
     titlePanel('test'), 
     sidebarPanel(
     sliderInput('width','Width: ', min=0,max=1000,value=100), 
     sliderInput('height','Height: ', min=0,max=1000,value=100) 

     ), 
    mainPanel(uiOutput('plot.ui')) 
    ) 
    ), 
    server=function(input,output){ 

    output$plot.ui=renderUI({ 
     plotOutput('plot',width=input$width,height=input$height) 

    }) 
    output$plot=renderPlot({ 
     plot(runif(100000,1,100),runif(100000,1,100)) 
    }) 
    } 
) 

Большое спасибо за помощь!

+0

Это не блестящий ... просто запущенный 'plot (runif (100000,1,100), runif (100000,1,100))' занимает секунду или два на моей машине. Это много точек для сюжета. – cory

ответ

0

У меня была аналогичная проблема, поэтому, если вы исправили проблему по-другому, дайте мне знать. Я попытался настроить размер plotOutput в зависимости от того, что я рисул (с определенными входами, у меня был горизонтальный график с 1 бар или 10 баров). Соответственно, необходимо было отрегулировать высоту.

Решение 1) Настроить высота renderplot() Как объясняется jcheng5 here. Смотрите, если это решает вопрос

Solution 2) Определить функцию участка, использование изолята()

# Define a function that returns a plot 
plot_function <- function(){ 
    plot(runif(100000,1,100),runif(100000,1,100) 
} 

# reactive UI and adjust the height here 
output$plot.ui=renderUI({ 
    plotOutput("plot", height = -------------) 
}) 
# call plot_function but use isolate() 
output$plot <- renderPlot({ 
    isolate(plot_function()) 
} 

Это работает для меня. Посмотрите, решит ли это проблему.

Смежные вопросы