2013-07-17 11 views
8

Mam aplikację z dużą liczbą parametrów. Każdy parametr ma dużą ziarnistość, która sprawia, że ​​znalezienie pożądanego jest uciążliwe. To powoduje, że część reaktywna stale oblicza, co spowalnia działanie. Dodałem metodę submitButton, która rozwiązała powyższy problem, ale potem pojawia się kolejny problem.Błyszcząca reaktywność

Poniżej znajduje się prosta replikacja budowanej przeze mnie struktury. Wprowadzanie parametru przyjmuje liczbę od 1 do 1000, która wskazuje próbkę, której chcę. To, co chciałbym zrobić, to móc zrobić powyżej, ale także móc ponownie próbkować z tym samym zestawem parametrów. To, co dzieje się teraz po dodaniu przycisku "Wyślij", powoduje, że przycisk ponownego próbkowania jest niedziałający, chyba że kliknę przycisk ponownie przeprowadź próbę, a następnie przycisk aktualizacji.

Jakieś pomysły na to, że będą działać osobno?

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 na podstawie Joe odpowiedź:

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

Masz niezwykły sposób pisania kodu. Tony białej przestrzeni * między * liniami, ale praktycznie * brak * wokół głównych operatorów ... –

+0

Przepraszam, będę edytować kod następnym razem przed wysłaniem, spieszyłem się z kopiowania i wklejania ... – user1234440

Odpowiedz

4
  • zmiana getY tak, że wszyscy, ale w pierwszej linii jest owinięty w izolacie ({...})
  • zmiana submitButton do actionButton
  • dodać linię wewnątrz renderPlot, aby przeczytać nową akcjęButton
+0

Wypróbowałem twoją sugestię. Teraz program wydaje się stagnacji po inicjalizacji bez względu na to, co prasuję. Dodałem zaktualizowaną wersję kodu. – user1234440

+0

@ user1234440 all **, ale pierwsza linia ** –

9

Odpowiedź została udzielona przez Joe Cheng w komentarzu powyżej, ale widząc, że OP miał trudności zrozumienia go, piszę go wyraźnie poniżej, dla przypomnienia:

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

Zauważ, że mając wejściowego $ action wewnątrz reaktywny(), gdzie "action" jest wartością inputID, actionButton, wystarczającą do uruchomienia nowego renderowania wykresu. Potrzebujesz tylko jednego actionButton.