2017-07-07 65 views
0

我想根据一个输入返回两个表。基本上,我正在阅读一个CSV文件,并且我希望在表格中显示CSV中的值,然后在第二个表格中显示CSV中的行数。带2个输出的闪亮服务器功能

现在我有

ui.R

ui <- fluidPage(
    sidebarLayout(
    sidebarPanel(
     fileInput("file1", "Choose CSV File", 
       accept = c(
        "text/csv", 
        "text/comma-separated-values,text/plain", 
        ".csv") 
    ), 
     tags$hr(), 
     checkboxInput("header", "Header", TRUE) 
    ), 
    mainPanel(
     tableOutput("rawData"), 
     tableOutput("rawDataSize") 
    ) 
) 
) 

server.R

server <- function(input, output) { 

    output$rawData <- renderTable({ 
    inFile <- reactive({input$file1}) 
    data <- reactive({ 
     if (is.null(inFile)) 
     return(NULL) 
     read.csv(inFile$datapath, header = input$header) 
    }) 
    }) 

    output$rawDataSize <- renderTable({ 
    dim(data)[1] 
    }) 

} 

不幸的是,这将返回Warning: Error in as.data.frame.default: cannot coerce class "c("reactiveExpr", "reactive")" to a data.frame

回答

2

移动inFile <- reactive({input$file1})以外的renderTable。然后,要使用这个反应性对象,你需要把它看作一个函数。 inFile()$datapath。对于您的data反应性对象也是如此。

所以,你server()最终看起来类似:

server <- function(input, output) { 

    inFile <- reactive({input$file1}) 

    data <- reactive({ 
    if (is.null(inFile())) return(NULL) 
    read.csv(inFile()$datapath, header = input$header) 
    }) 

    output$rawData <- renderTable({ 
    data() 
    }) 

    output$rawDataSize <- renderTable({ 
    dim(data())[1] 
    }) 

} 
1

1-反应是一种功能,所以在调用时总是加上()

2-避免嵌套reactives:

server <- function(input, output) { 
    inFile <- reactive(input$file1) 

    data <- reactive({ 
     if (is.null(inFile())) 
      return(NULL) 
     read.csv(inFile()$datapath, header = input$header) 
     }) 

    output$rawData <- renderTable(data()) 

    output$rawDataSize <- renderTable(dim(data())[1]) 
} 
+1

英雄所见略同? :) –

+0

哇...和你们同时回答!谢谢! – agf1997