2013-07-17 10 views
8

Ich habe eine Anwendung mit einer großen Anzahl von Parametern. Jeder Parameter hat eine große Granularität, die es schwierig macht, den gewünschten zu finden. Dies bewirkt, dass der reaktive Teil ständig berechnet, was die Dinge verlangsamt. Ich habe einen submitButton hinzugefügt, der das obige Problem löste, aber dann wiederum ein anderes Problem hatte.Shiny Reactivity

Unten ist eine einfache Replikation des Framework, das ich erstelle. Die Parametereingabe nimmt eine Zahl von 1 bis 1000 an, die das Beispiel angibt, zu dem ich möchte. Was ich tun möchte, ist, oben zu tun, aber auch in der Lage zu sein, mit den gleichen Parametern zu resampeln. Was passiert jetzt nach dem Hinzufügen der Schaltfläche "Senden" ist, dass es die Schaltfläche Resample funktionsunfähig macht, es sei denn, ich klicke zuerst Resample zuerst UND dann Update-Schaltfläche.

Irgendwelche Ideen, sie beide getrennt arbeiten zu lassen?

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 basierend auf Joes Antwort:

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

Sie haben eine bemerkenswerte Art, Code zu schreiben. Tonnen Leerraum * zwischen * Zeilen aber praktisch * keine * um Schlüsseloperatoren ... –

+0

Sorry wird den Code das nächste Mal vor dem Posten bearbeiten, ich hatte es eilig vom Kopieren und Einfügen ... – user1234440

Antwort

4
  • Änderung getY, so dass alle, aber die erste Zeile wird in Isolat eingewickelt ({...})
  • Änderung submitButton zu actionButton
  • fügen Sie eine Zeile innerhalb von renderPlot hinzu, um den neuen actionButton zu lesen
+0

Ich habe deinen Vorschlag ausprobiert. Jetzt scheint das Programm nach der Initialisierung zu stagnieren, egal was ich drücke. Ich habe eine aktualisierte Version des Codes hinzugefügt. – user1234440

+0

@ user1234440 alle ** aber die erste Zeile ** –

9

Die Antwort von Joe Cheng in einem Kommentar oben gegeben wurde, aber zu sehen, dass die OP Schwierigkeiten zu verstehen, es war, schreibe ich es ausdrücklich unten aus, für die Aufzeichnung:

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

Beachten Sie, dass Aktion Eingang $ innerhalb reaktiven(), wobei "action" die inputButton-Eingabe-ID ist, reicht aus, um ein neues Rendering des Plots auszulösen. Du brauchst also nur einen actionButton.