答案 0 :(得分:2)
只需设置一个反应块即可为您提供数据:
library(shiny)
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("contents")
)
)
)
server <- function(input, output) {
mydata <- reactive({
# input$file1 will be NULL initially. After the user selects
# and uploads a file, it will be a data frame with 'name',
# 'size', 'type', and 'datapath' columns. The 'datapath'
# column will contain the local filenames where the data can
# be found.
req(input$file1, input$header, file.exists(input$file1$datapath))
read.csv(input$file1$datapath, header = input$header)
})
output$contents <- renderTable({
req(mydata())
mydata()
})
}
shinyApp(ui, server)
现在您需要在其他任何地方使用新的data.frame
,只需使用mydata()
。 (我唯一的更改是将一些行移动到新的反应式块中,缩短renderTable
块,并使用req(...)
而不是笨拙的is.null
方法。)
一些附加说明:
shiny
应用中,对反应式块做好一件事情非常有用,例如“获取数据”,“绘图数据”,“适应/更改数据”。正是由于这个原因,我将原来的“读取文件然后呈现”的单个块分解为“读取文件”(向一个或多个使用者提供数据)并“呈现”的两个块。这需要与反应性平衡,这意味着依赖于其他块的块越多,我称之为应用程序组件“超抖动”的可能性就越大。例如,如果块“ B”依赖于“ A”,而块“ C”依赖于“ A”和“ B”,那么您可能会看到以下更新时间表:
将两个项目符号结合起来:将“读取和渲染”分为“读取”和“渲染”似乎是合理的。如果您要处理数据(删除/添加列,过滤出行等),
selectInput
,numericInput
等),那么您可能应该使用“ read” ,“更新”,“渲染”阶段,这样您就不必在用户每次更改其他字段之一时都重新读取数据