我正在尝试根据一个输入返回两个表。基本上,我正在读取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
答案 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])
}