r - 在闪亮的应用程序中上传文件并通过 textInput() 设置其名称
问题描述
我在下面有一个简单的闪亮应用程序。在这个应用程序中,我希望用户能够上传自己的 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
})
}
解决方案
我不得不彻底检查服务器和 ui 以使用内置的闪亮功能来使这更容易。话虽如此,这可以满足您的所有需求。请注意,我在这里没有显示任何表格制作或数据处理,只是文件重命名和上传。
# 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")),
checkboxGroupInput("datasetSelector","Data Files", choices=c("D.B")),
textInput("filename","Set Filename",value = "Set Name")
),
# Main panel for displaying outputs ----
mainPanel(
# Output: Data file ----
tableOutput("contents")
)
)
)
#server.r
server <- function(input, output, session) {
observeEvent(input$filename, {
req(input$file1)
Name<-input$filename
updateCheckboxGroupInput(session,"datasetSelector", choices=c("D.B",Name))
})
observeEvent(input$file1, {
Data<-input$file1$datapath
Name<-input$filename
New <- read.csv(Data)
updateCheckboxGroupInput(session,"datasetSelector",
choices=c("D.B",input$file1$name))
})
#Data proccesing code
}
我使用了checkboxGroupInput
和textInput
是可以在 UI 中定义的闪亮输入。这些设置了标准输入,并允许我们使用updateGroupCheckboxInput
无法在一般 UI 渲染中使用的功能。fileInput
现在我们可以观察到and的任何输入,textInput
并根据何时完成运行代码。
当用户上传文件时,复选框的名称设置为上传的文件名。当用户更改时,input$filename
我们可以观察到并相应地更改复选框名称。这样,无论何时上传新文件,它都会用上传的新文件名覆盖现有的复选框名称,而新文件名又可以被我们文本字段的任何输入覆盖。
摆脱响应式数据库并简单地观察复选框中的任何输入,我们可以简单地根据选中的框数分配数据,因为如果选中了两个,我们应该加载数据库和上传的文件;如果选中一个,我们可以检查“DB”的名称、分配的文件名或文本字段名称,并相应地显示正确的文件。数据库文件始终加载,而输入文件仅在选中复选框时才加载。由于除非有上传的文件,否则没有复选框,这应该涵盖我们那里。
#Data Processing Code
observeEvent(input$datasetSelector, {
#Constant
D.B<- read.csv("somthing.csv", stringsAsFactors = F)
Selected<-input$datasetSelector
L_Sel<-length(Selected)
if(L_Sel==2){
Data<-read.csv(input$file1$datapath)
dataSelector<-list(Data,D.B)
print("A")
}else if(Selected=="D.B"){
dataSelector<-D.B
print("B")
}else if(Selected==input$file1$name|Selected==input$filename){
Data<-read.csv(input$file1$datapath)
dataSelector<-Data
print(Data)
print("C")
}else{
dataSelector=NA
}
output$contents<-renderTable({
dataSelector
})
})
请注意,我们还将输出放在复选框的 observeEvent 下,因此除非您在部署时为复选框设置选定的值,否则不会初始化任何表。我不确定你想如何显示这两个表,所以这需要一些工作,但只需在 if/statement 和 observeEvent 中工作即可。
该程序知道何时选中两个复选框并列出两个文件/数据,但我不确定您计划如何显示这些。不过,您可能希望将该工作包含在该if(L_Sel==2){..}
部分下。
推荐阅读
- google-cloud-run - GKE 上 Cloud Run 上的 Websocket 请求错误
- sql - SQL 到 SSAS 计算脚本
- android - 如何在 Kotlin 的卡片视图中设置属性
- python - 使用 PIL(LOW) 绘制重叠的轮廓文本
- c# - 无法在 Excel 单元格中输入“空”文本
- xml - 有什么方法可以运行 XSLT 并使用 Apache fop 在线生成 PDF?
- java - 如何激活具有多个条件的 Eclipse UI 处理程序
- office-js - 如何使用 Office-js API 使自定义 Word-Addin 检查拼写错误
- c++ - 函数返回的类的析构函数
- android - 如何从 Facebook 帐户工具包中获取用户输入的号码?