2013-07-17 15 views
8

Ho un'applicazione con un numero elevato di parametri. Ogni parametro ha un sacco di granularità che rendono il trovare quello desiderato un dolore. Ciò fa sì che la parte reattiva calcoli costantemente che rallenta le cose. Ho aggiunto un pulsante submit che ha risolto il problema precedente, ma poi ho riscontrato un altro problema a sua volta.Shiny Reactivity

Di seguito è riportata una semplice replica del framework I build. Il parametro input prende un numero da 1 a 1000, che indica il campione a cui voglio. Quello che mi piacerebbe fare è essere in grado di fare sopra, ma anche essere in grado di ricampionare con lo stesso insieme di parametri. Quello che sta accadendo ora dopo aver aggiunto il pulsante di invio è che rende inutilizzabile il pulsante resample, a meno che non faccia clic su ricampiona prima E poi aggiorni il pulsante.

Qualche idea di far funzionare entrambi separatamente?

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 in base alla risposta di Joe:

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

Hai un notevole modo di scrivere codice. Tonnellate di spazio bianco * tra * linee ma praticamente * nessuna * attorno agli operatori chiave ... –

+0

mi dispiace modificare il codice la prossima volta prima di pubblicare, ero di fretta da copia e incolla ... – user1234440

risposta

4
  • cambiamento Gety in modo che tutti, ma la prima linea è avvolto in isolate ({...})
  • cambiamento submitButton a ActionButton
  • aggiungi una riga all'interno di renderPlot per leggere la nuova actionButton
+0

Ho provato il tuo suggerimento. Ora il programma sembra ristagnare dopo l'inizializzazione, non importa quello che premo. Ho aggiunto una versione aggiornata del codice. – user1234440

+0

@ user1234440 all ** ma la prima riga ** –

9

La risposta è stata data da Joe Cheng in un commento precedente, ma visto che il PO aveva difficoltà a capire, io scrivo esplicitamente al di sotto, per la cronaca:

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

Nota che avere ingresso $ azione all'interno reattiva(), dove "action" è l'ID di input di ActionButton, è sufficiente per attivare un nuovo rendering della trama. Quindi hai bisogno di un solo actionButton.