【发布时间】:2018-10-12 14:38:43
【问题描述】:
我在下面有一个简单的闪亮应用程序。在这个应用程序中,我希望用户能够上传他自己的 csv,然后自动将其作为选项添加到另一个数据集“DB”(我在原始应用程序中创建)下方的复选框组中。我通过使用一个观察者和一个记录文件名的反应列表来做到这一点。新文件最初将具有其默认名称,但随后用户将能够使用“设置文件名”textInput() 将其更改为他选择的名称。然后当用户选择一个文件时,它将显示为一个表格。问题是我遗漏了一些东西,当我添加第二个文件时,第一个文件变为 NA 并且没有显示任何表格。
#ui.r
library(shiny)
library(rlist)
# Define UI for data upload app ----
ui <- fluidPage(
# App title ----
titlePanel("Uploading Files"),
# Sidebar layout with input and output definitions ----
sidebarLayout(
# Sidebar panel for inputs ----
sidebarPanel(
# Input: Select a file ----
fileInput("file1", "Choose CSV File",
multiple = FALSE,
accept = c("text/csv",
"text/comma-separated-values,text/plain",
".csv")),
uiOutput("checkbox"),
uiOutput("text")
),
# Main panel for displaying outputs ----
mainPanel(
# Output: Data file ----
tableOutput("contents")
)
)
)
#server.r
server <- function(input, output) {
output$text<-renderUI({
textInput("filename","Set Filename",value = "Set Name")
})
New <- reactive({
req(input$file1)
df <- read.csv(input$file1$datapath)
})
D.B <- reactive({
if("D.B"%in% input$datasetSelector){
x <- read.csv("something.csv", stringsAsFactors = F)
}
})
fileOptions <- reactiveValues(currentOptions=c("D.B."))
observeEvent(input$file1, {
fileOptions$currentOptions = list.append(fileOptions$currentOptions, "New")
})
output$checkbox<-renderUI({
if(length(fileOptions$currentOptions)==1){
checkboxGroupInput("datasetSelector","Specify the datasets to compare:", choices = fileOptions$currentOptions[[1]]
)}
else{
names(fileOptions$currentOptions)[[2]]<-input$filename
checkboxGroupInput("datasetSelector","Specify the datasets to compare:", choices = fileOptions$currentOptions
)}
})
output$contents <- renderTable({
input$dataSelector
})
}
【问题讨论】:
-
据我所知,该应用程序无法存储多个文件。上传文件后,它被分配为“file1”,如果您要上传另一个文件,它将覆盖“file1”。这是预期的结果吗?就像你想只显示“DB”和选择的任何文件一样吗?
-
虽然我现在无法尝试并提出具体的潜在解决方案,但建议你看看
shinyFiles,它可能会解决这个问题的一半。 -
文件也应该显示为表格。就像一个文件名。