2013-07-16 40 views
8

Hãy nói rằng tôi có file server.R sau trong sáng bóng:Đặt đối tượng toàn cầu trong Shiny

shinyServer(function(input, output) { 
    output$plot <- renderPlot({ 
    data2 <- data[data$x == input$z, ] # subsetting large dataframe 
    plot(data2$x, data2$y) 
    }) 
    output$table <- renderTable({ 
    data2 <- data[data$x == input$z, ] # same subset. Oh, boy... 
    summary(data2$x) 
    }) 
}) 

Những gì tôi có thể làm để không phải chạy data2 <- data[data$x == input$z, ] trong mỗi cuộc gọi render? Nếu tôi làm như sau, tôi nhận được lỗi "đối tượng thuộc loại 'đóng' không được đặt":

shinyServer(function(input, output) { 
    data2 <- reactive(data[data$x == input$z, ]) 
    output$plot <- renderPlot({ 
    plot(data2$x, data2$y) 
    }) 
    output$table <- renderTable({ 
    data2 <- data[data$x == input$z, ] 
    summary(data2$x) 
    }) 
}) 

Tôi đã làm gì sai?

Trả lời

17

data2 là một hàm trả về tập con bạn đang tìm kiếm. Vì vậy, bạn cần phải gọi data2 và lưu đầu ra đối với một số biến sau đó bạn có thể vẽ/tóm tắt các cột khác nhau

## data should be defined somewhere up here or in global.R 

shinyServer(function(input, output) { 
    data2 <- reactive(data[data$x == input$z, ]) 

    output$plot <- renderPlot({ 
    newData <- data2() 
    plot(newData$x, newData$y) 
    }) 

    output$table <- renderTable({ 
    newData <- data2() 
    summary(newData$x) 
    }) 
}) 

Nếu bạn chưa sẵn sàng, tôi khuyên bạn nên đọc qua http://rstudio.github.io/shiny/tutorial/#welcome. Các trang trên phản ứng địa chỉ câu hỏi này khá tốt.

+0

Cảm ơn sự giúp đỡ, tôi rất mới với Shiny (đó là ngày thứ hai của tôi làm việc với nó). Giải pháp của bạn hoạt động, nhưng không phải khi tôi chèn một 'ifelse()' vào trong tập con của tôi, mà thực sự là một cái gì đó như thế này: 'data2 <- reactive (ifelse (input $ z == '', data, data [data $ x == đầu vào $ z,])) '. Khi tôi làm điều này, tôi nhận được lỗi sau: 'Lỗi trong plot.window (xlim, ylim, log = log, ...): cần các giá trị 'xlim' hữu hạn'. –

+0

BTW, tôi đang hướng dẫn với RStudio (ít nhất là các phần cơ bản) và dự định đào sâu hơn vào nó và tài liệu gói theo thời gian. –

+2

@wleoncio rằng lỗi gần như chắc chắn là vì bạn đang chuyển một 'data.frame' trống vào lô. Vì vậy, tôi sẽ đề nghị làm một số gỡ lỗi để tìm ra nếu 'data2' trả về những gì bạn mong đợi. Bạn cũng có thể thêm vào các kiểm tra trong hàm đầu ra lô của bạn như 'if (nrow (newData) == 0) return()' sẽ giữ cho nó không cố định nếu không có dữ liệu. Trong khi tôi đang làm việc trên một ứng dụng sáng bóng, tôi thích thêm một bảng, để được nhận xét sau này, điều đó sẽ chỉ in các giá trị gỡ lỗi khác nhau (tức là số hàng trong dữ liệu hiện tại, mức của một biến nhất định, v.v.) –

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