闪亮的服务器功能,带2个输出

时间:2017-07-07 21:58:09

标签: r shiny

我正在尝试根据一个输入返回两个表。基本上,我正在读取CSV并且我想在表格中显示CSV中的值,然后在第二个表格中显示CSV中行数的计数。

现在我有

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 个答案:

答案 0 :(得分: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)

1- A reactive是一个函数,因此在调用它时总是添加()

2-避免嵌套反应:

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