R 在闪亮的应用程序中上载文件,并通过textInput()设置其名称
下面我有一个简单的闪亮应用程序。在此应用程序中,我希望用户能够上传自己的csv,然后自动将其添加为另一个数据集“D.B”(我在原始应用程序中创建)下方复选框组中的选项。我是通过使用一个观察者和一个反应列表来实现的,在这个列表中我输入了文件名。新文件最初将具有其默认名称,但用户可以使用“Set Filename”textInput()将其更改为自己选择的名称。然后,当用户选择一个文件时,它将显示为一个表。问题是我遗漏了一些东西,当我添加第二个文件时,第一个文件变成NA,并且没有显示任何表格R 在闪亮的应用程序中上载文件,并通过textInput()设置其名称,r,shiny,R,Shiny,下面我有一个简单的闪亮应用程序。在此应用程序中,我希望用户能够上传自己的csv,然后自动将其添加为另一个数据集“D.B”(我在原始应用程序中创建)下方复选框组中的选项。我是通过使用一个观察者和一个反应列表来实现的,在这个列表中我输入了文件名。新文件最初将具有其默认名称,但用户可以使用“Set Filename”textInput()将其更改为自己选择的名称。然后,当用户选择一个文件时,它将显示为一个表。问题是我遗漏了一些东西,当我添加第二个文件时,第一个文件变成NA,并且没有显示任何表格 #ui
#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.r
图书馆(闪亮)
图书馆(rlist)
#定义数据上传应用程序的用户界面----
ui我必须彻底检修服务器和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
}
注意,我们还将复选框的输出放在observeEvent下,因此,除非在部署时为复选框设置选定值,否则任何表都不会初始化。我不确定您希望如何显示这两个表,因此需要做一些工作,但只需在if/语句和复选框的observeEvent中工作即可
程序知道何时选中这两个复选框,并列出两个文件/数据,但我不确定您打算如何显示这些文件/数据。不过,您可能希望将该工作包含在if(L_Sel==2){..}
部分。据我所知,该应用程序无法存储多个文件。上传一个文件后,它将被指定为“file1”,如果要上传另一个文件,它将覆盖“file1”。这是预期的结果吗?如中所示,您是否只想显示“D.B”和所选的任何文件?虽然我现在无法尝试并提出具体的潜在解决方案,但建议您查看shinyFiles
,这可能会解决一半问题。该文件还应显示为表。作为一个文件名.Tnx,以获取您的详细答案,但我如何使用我上载的文件并将其显示为表格?不幸的是,如果我不能使用表格,我就不能使用此方法。@firmo23您找到表格了吗?我正在制定一个解决方案,但如果您有办法,请毫不犹豫地在此处共享。您是否可能提供此解决方案对于6个默认数据集,而不是一个??我想那可能有用
#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
})
})