2013-07-17 3 views
8

У меня есть приложение с большим количеством параметров. Каждый параметр имеет большую детализацию, которая делает поиск желаемой болью. Это заставляет реактивную часть постоянно вычислять, что замедляет работу. Я добавил submitButton, который решил вышеупомянутую проблему, но затем испытал другую проблему по очереди.Блестящая реактивность

Ниже приведена простая репликация структуры, которую я построил. Ввод параметра принимает число от 1 до 1000, что указывает на образец, который я хочу. То, что я хотел бы сделать, - это сделать выше, но также иметь возможность повторной выборки с тем же набором параметров. То, что происходит сейчас после добавления кнопки отправки, состоит в том, что она делает кнопку повторной выборки неработоспособной, если я не нажму кнопку Resample first AND и update.

Любые идеи о том, что они оба работают отдельно?

shinyServer(function(input, output) { 
    getY<-reactive({ 
    a<-input$goButton 
    x<-rnorm(input$num) 
    return(x) 
    }) 

    output$temp <-renderPlot({ 
    plot(getY()) 
    }, height = 400, width = 400) 
}) 

shinyUI(pageWithSidebar(
    headerPanel("Example"), 
    sidebarPanel(
    sliderInput("num", 
      "Number of Samples", 
      min = 2, 
      max = 1000, 
      value = 100), 
    actionButton("goButton", "Resample"), 
    submitButton("Update View")   
), 
    mainPanel(
    tabsetPanel(  
     tabPanel("Heatmap", 
       plotOutput("temp") 
    ), 
     tabPanel("About"),  
     id="tabs" 
    )#tabsetPanel  
)#mainPane; 
)) 

EDIT на основе Ответ Джо:

shinyServer(function(input, output) { 
    getY<-reactive({ 

    isolate({a<-input$goButton 
     x<-rnorm(input$num) 
     return(x)}) 
    }) 

    output$temp <-renderPlot({ 
    b<-input$goButton1 
    plot(getY()) 
    }, height = 400, width = 400) 
}) 

shinyUI(pageWithSidebar(
    headerPanel("Example"), 
    sidebarPanel(
    sliderInput("num", 
      "Number of Samples", 
      min = 2, 
      max = 1000, 
      value = 100), 
    actionButton("goButton", "Resample"), 
    actionButton("goButton1","Update View")   
), 
    mainPanel(
    tabsetPanel(  
     tabPanel("Heatmap", 
       plotOutput("temp") 
    ), 
     tabPanel("About"),  
     id="tabs" 
    )#tabsetPanel  
)#mainPane; 
)) 
+0

У вас замечательный способ написания кода. Тонны белого пространства * между * линиями, но практически * нет * вокруг ключевых операторов ... –

+0

Извините, отредактируйте код в следующий раз перед публикацией, я спешил с копирования и вставки ... – user1234440

ответ

4
  • изменение GetY так, что все, кроме первой строки обернут в изолята ({...})
  • изменение submitButton в actionButton
  • добавить строку внутри renderPlot, чтобы прочитать новое действие. Баттон
+0

Я попробовал ваше предложение. Теперь программа, кажется, застаивается после инициализации независимо от того, что я нажимаю. Я добавил обновленную версию кода. – user1234440

+0

@ пользователь1234440 все ** но первая линия ** –

9

Ответ был дан Джо Ченг в указанном выше комментарии, но, видя, что OP были трудности с пониманием, я пишу это явно ниже, для записи:

# ui.R 

library("shiny") 
shinyUI(
    pageWithSidebar(
    headerPanel("Example") 
    , 
    sidebarPanel(
     sliderInput("N", "Number of Samples", min = 2, max = 1000, value = 100) 
     , 
     actionButton("action", "Resample") 
    ) 
    , 
    mainPanel(
     tabsetPanel(  
     tabPanel("Plot", plotOutput("plotSample")) 
     , 
     id = "tabs1" 
    ) 
    ) 
) 
) 

# server.R 

library("shiny") 
shinyServer(
    function(input, output, session) { 
    Data <- reactive({ 
     input$action 
     isolate({ 
      return(rnorm(input$N)) 
      return(x) 
     }) 
    }) 
    output$plotSample <-renderPlot({ 
     plot(Data()) 
    } , height = 400, width = 400 
) 
}) 

Обратите внимание, что наличие ввода $ действие внутри реактивная(), где «действие» - это идентификатор ввода actionButton, достаточно, чтобы вызвать новый рендеринг графика. Так что вам нужно только одно действие.