2014-07-06 17 views
9

Tôi mới sử dụng R-Shiny và câu hỏi của tôi có thể rất đơn giản. Sau nhiều giờ suy nghĩ và tìm kiếm, tôi không thể giải quyết vấn đề. Đây là vấn đề:xử lý tập dữ liệu đầu vào trong R Shiny

1) Ứng dụng của tôi yêu cầu người dùng tải lên tập dữ liệu của mình.

2) Sau đó, trong tệp máy chủ, tôi đọc tập dữ liệu và tôi đã thực hiện một số phân tích và tôi báo cáo lại kết quả vào giao diện người dùng.

3) Giao diện người dùng của tôi có 4 cài đặt khác nhau.

4) Tôi đọc tập dữ liệu trong hàm "hiển thị" của từng đầu ra. ISSUE: bằng cách làm như vậy, dữ liệu được xác định cục bộ trong phạm vi của từng chức năng có nghĩa là tôi cần đọc lại nó cho mỗi đầu ra.

5) Điều này rất hiệu quả, Có cách nào khác không? sử dụng phản ứng?

6) Dưới đây là một số mẫu mã cho thấy làm thế nào tôi đã viết server.R tôi:

shinyServer(function(input, output) { 

    # Interactive UI's: 
    # %Completion 

    output$myPlot1 <- renderPlot({ 
    inFile <- input$file 

     if (is.null(inFile)) return(NULL) 
     data <- read.csv(inFile$datapath, header = TRUE) 

     # I use the data and generate a plot here 

    }) 

    output$myPlot2 <- renderPlot({ 
    inFile <- input$file 

     if (is.null(inFile)) return(NULL) 
     data <- read.csv(inFile$datapath, header = TRUE) 

     # I use the data and generate a plot here 

    }) 

}) 

Làm thế nào tôi có thể chỉ nhận được dữ liệu đầu vào một lần và chỉ cần sử dụng các dữ liệu trong các chức năng đầu ra của tôi?

Cảm ơn rất nhiều,

Trả lời

7

Bạn có thể gọi dữ liệu từ tệp theo chức năng reactive. Sau đó nó có thể được truy cập ví dụ như myData() trong reactive chức năng khác:

library(shiny) 
write.csv(data.frame(a = 1:10, b = letters[1:10]), 'test.csv') 
runApp(list(ui = fluidPage(
    titlePanel("Uploading Files"), 
    sidebarLayout(
    sidebarPanel(
     fileInput('file1', 'Choose CSV File', 
       accept=c('text/csv', 
         'text/comma-separated-values,text/plain', 
         '.csv')) 
    ), 
    mainPanel(
     tableOutput('contents') 
    ) 
) 
) 
, server = function(input, output, session){ 
    myData <- reactive({ 
    inFile <- input$file1 
    if (is.null(inFile)) return(NULL) 
    data <- read.csv(inFile$datapath, header = TRUE) 
    data 
    }) 
    output$contents <- renderTable({ 
    myData() 
    }) 

} 
) 
) 

enter image description here

+1

Hi @jdharrison, cảm ơn rất nhiều cho câu trả lời của bạn. Tôi thực sự đã cố gắng nhưng tôi nhận được lỗi rằng "đối tượng của loại 'đóng cửa' không phải là subsettable". – Sam

+0

Xin lưu ý rằng sau này trong hàm render của tôi tham chiếu đến "myData" và sẽ sử dụng một số cột dữ liệu thông qua toán tử $. Tôi nhận được lỗi trên bất cứ lúc nào tôi sử dụng một cột như myData $ col1. – Sam

+1

Làm việc tốt cho tôi. Cột này sẽ được truy cập dưới dạng 'myData() $ col1' tuy nhiên trước tiên bạn sẽ làm một cái gì đó như' mydata <- myData() 'trước tiên trong hàm phản ứng của bạn. – jdharrison

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