2013-07-17 35 views
8

Tôi có một ứng dụng với số lượng lớn tham số. Mỗi thông số có rất nhiều chi tiết mà làm cho việc tìm kiếm mong muốn một nỗi đau. Điều này làm cho phần phản ứng liên tục tính toán làm chậm mọi thứ. Tôi đã thêm một submitButton để giải quyết vấn đề trên nhưng sau đó lại gặp phải một vấn đề khác.Phản ứng sáng bóng

Dưới đây là bản sao đơn giản của khung tôi xây dựng. Tham số đầu vào có một số từ 1 đến 1000, cho biết mẫu mà tôi muốn. Những gì tôi muốn làm là có thể làm ở trên mà còn có thể tái tạo mẫu với cùng một tập hợp các tham số. Điều gì đang xảy ra bây giờ sau khi thêm nút gửi là nó làm cho nút resample không thể hoạt động trừ khi tôi nhấp vào resample đầu tiên VÀ sau đó cập nhật nút.

Bất kỳ ý tưởng nào khiến cả hai hoạt động riêng biệt?

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 dựa trên trả lời của 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

Bạn có cách viết mã đáng chú ý. Tonnes của không gian trắng * giữa * dòng nhưng hầu như * không * xung quanh các nhà khai thác chính ... –

+0

xin lỗi sẽ chỉnh sửa mã lần sau trước khi đăng bài, tôi đã vội vàng sao chép và dán ... – user1234440

Trả lời

4
  • thay đổi GetY để tất cả nhưng dòng đầu tiên được gói trong isolate ({...})
  • thay đổi submitButton để actionButton
  • thêm một dòng bên trong renderPlot để đọc actionButton mới
+0

Tôi đã thử đề xuất của bạn. Bây giờ chương trình dường như trì trệ sau khi khởi tạo bất kể tôi bấm gì. Tôi đã thêm phiên bản cập nhật của mã. – user1234440

+0

@ user1234440 tất cả ** nhưng dòng đầu tiên ** –

9

Câu trả lời được đưa ra bởi Joe Cheng trong một chú thích ở trên, nhưng nhìn thấy rằng OP đã khó khăn tìm hiểu nó, tôi viết nó ra một cách rõ ràng dưới đây, để kỷ lục:

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

Lưu ý rằng có đầu vào $ hành động bên trong phản ứng(), trong đó "hành động" là inputID của actionButton, là đủ để kích hoạt một kết xuất mới của cốt truyện. Vì vậy, bạn chỉ cần một actionButton.

Các vấn đề liên quan