John,在遇到此类问题时,查看 Shiny 库并查看 Stack Overflow 上过去的答案以获取代码示例总是一个好主意。
这是数据上传的示例教程。这可以是 CSV 而不仅仅是 xls。
https://shiny.rstudio.com/gallery/file-upload.html。但是代码布局可能对您设置输入很有用。
保持简单?您可以将想要的数据范围保存为 csv 文件,这样您的用户就无需指定数据范围和工作表。我这样做是为了让用户只需要在选择框中查看他们想要的数据集,而不是去寻找数据。请参见下面的示例。 (这可能会为您节省大量错误捕获代码)。
不要忘记转换您的数据。请注意this example,您可能需要在其中考虑一些变量。
如 Parth 所述,请参阅 https://www.r-bloggers.com/read-excel-files-from-r/ 了解有关包 Xl_Connect 和 xlsx 的更多详细信息。您可以指定工作表。
使用文件
一些可以帮助你的代码sn-ps。我已经将数据块作为 csv 文件提供。使用这些文件的列表设置一个 selectInput
# in ui.R
selectInput(("d1"), "Data:", choices = data.choices)
我用这段代码在 global.R 中填写 data.choices。
# filter on .csv
data.files <- list.files(path = "data", pattern = ".csv")
# dataset choices (later perhaps break by date)
# sort by date most recent so selectInput takes first one
data.choices <- sort(data.files, decreasing = TRUE)
我在 selectInput 周围有一个反应,然后加载数据。 (我使用 data.tables 包 fread,因此如果您使用此代码,则需要安装此包并使用 library(data.tables))。
dataset1 <- reactive({
validate(
need(input$d1 != "", "Please select a data set")
)
if (!is.null(input$d1)) {
k.filename <- input$d1 # e.g. 'screendata20160405.csv'
isolate({
## part of code this reactive should NOT take dependency on
# LOAD CSV
s.dt <- fread(file.path("data", k.filename),
na.strings = c("NA", "#N/A")) %>%
rename(ticker = Ticker)
# You might choose to rather dot.the.column.names to save DT issues
#setnames(DT, make.names(colnames(DT)))
# SET KEYS IF RELEVANT
k.id.cols <- c("ticker")
if ("date" %in% names(s.dt)) {
k.id.cols <- c(k.id.cols, "date")
}
setkeyv(s.dt, k.id.cols)
# NAME CHANGES rename columns if necessary
setnames(s.dt, "Short Name", "name")
})
} else {
s.dt <- NULL #input$d1 is null
}
s.dt
})
请注意验证,因为我的数据被绘制并且我想避免错误消息。请欣赏上面的关键设置和重命名列代码不是必需的,而是特定于我的示例,但它向您展示了您可以做些什么来让您的数据为用户“准备好”。
列出工作表名称
约翰这非常有用。看看谷歌群组https://groups.google.com/forum/#!topic/shiny-discuss/Mj2KFfECBhU上的这个长线程
Huidong Tian 在 2014 年 3 月 17 日有这个非常有用的代码(但也请参阅 Stephane Laurent 的关于关闭 XLConnect 以管理内存的代码):
library(XLConnect)
shinyServer(function(input, output) {
Dat <- reactiveValues()
observe({
if (!is.null(input$iFile)) {
inFile <- input$iFile
wb <- loadWorkbook(inFile$datapath)
sheets <- getSheets(wb)
Dat$wb <- wb
Dat$sheets <- sheets
}
})
output$ui <- renderUI({
if (!is.null(Dat$sheets)) {
selectInput(inputId = "sheet", label = "Select a sheet:", choices = Dat$sheets)
}
})
observe({
if (!is.null(Dat$wb)) {
if (!is.null(input$sheet)){
dat <- readWorksheet(Dat$wb, input$sheet)
print(names(dat))
output$columns <- renderUI({
checkboxGroupInput("columns", "Choose columns",
choices = names(dat))
})
}
}
})
})
shinyUI(pageWithSidebar(
# Include css file;
tagList(
tags$head(
tags$title("Upload Data"),
tags$h1("Test")
)
),
# Control panel;
sidebarPanel(
fileInput(inputId = "iFile", label = "Escolha um arquivo:", accept="application/vnd.ms-excel"),
radioButtons("model", "Escolha do Modelo:",
list("CRS" = "crs",
"VRS" = "vrs")),
br(),
tags$hr(),
uiOutput(outputId = "ui"),
uiOutput(outputId = "columns")
),
# Output panel;
mainPanel()
))