Я хочу создать блестящее приложение, которое загружает файл с помощью shinyFiles
, тогда пользователь должен иметь возможность отфильтровать данные по:
a) с помощью ввода textArea
, куда пользователь может вставитьнекоторые значения и таблица данных будет отфильтрована
b) пользователь загружает файл, а затем таблица данных фильтруется по значениям в загруженном файле (загруженный файл должен быть файлом с заголовком и геном за строкой)
Это мой код, но я не могу создать набор данных фильтра, если я использую textAreaInput
и shinyFilesButton
в одном и том же tabItem
.Я хотел бы сохранить его на том же tabItem
и не создавать два разных tabItems
.
Проблема в том, что когда я загружаю файл, он работает отлично, но если я набираю textAreaInput
, то ничегослучается, я хотел бы создать фильтр удаления или аналогичный, который позволил бы мне запускать тот или иной фильтр.
Это код, который у меня есть:
header <- dashboardHeader()
sidebar <- dashboardSidebar(
sidebarUserPanel("Panelado variantes"),
sidebarMenu(
# Setting id makes input$tabs give the tabName of currently-selected tab
id = "tabs",
menuItem("Archivo variantes", tabName = "fileupload", icon = icon("table")),
conditionalPanel("input.tabs == 'fileupload' ",
shinyFilesButton("file", "Choose a file" , multiple = FALSE, title = "Please select a file:",buttonType = "default", class = NULL)#,
),
menuItem("Panelado por genes", tabName="panelado"),
conditionalPanel("input.tabs == 'panelado'",
shinyFilesButton("file_gene", "upload gene list" , multiple = FALSE, title = "Please upload a gene list:", buttonType = "default", class = NULL),
textAreaInput(inputId = "genes", label = "Gene List", value = "Paste some genes", width = "180", height = "200"),
actionButton("go", "Filter")
)
)
)
body <- dashboardBody(
tags$style(type="text/css",
".shiny-output-error { visibility: hidden; }",
".shiny-output-error:before { visibility: hidden; }",
".shiny-output-error:after { visibility: hidden; }"),
tabItems(
tabItem(tabName = "fileupload",
fluidPage(
box(width=12, height = '1000px',
column(12,dataTableOutput("tabla"))
)
)
),
tabItem("panelado",
fluidPage(
box(width=18, height = '950px',
column(12,dataTableOutput("tablafilt")))
)
)
)
)
ui <- dashboardPage(header, sidebar, body)
server = function(input, output, session) {
volumes = getVolumes()
volumes <- c(Home = fs::path_home(), "R Installation" = R.home(), getVolumes()())
file_selected <- reactive({
shinyFileChoose(input, "file", roots = volumes, session = session)
if (is.null(input$file))
return(NULL)
print(parseFilePaths(volumes, input$file)$datapath)
return(parseFilePaths(volumes, input$file)$datapath)
})
contents <- reactive({
if (is.null(file_selected()))
return()
df <- read.delim(file_selected(), header = TRUE, stringsAsFactors=FALSE, as.is=TRUE)
return(df)
})
output$tabla <- DT::renderDataTable({
if(is.null(contents()))
return()
datos <- contents()
DT::datatable(datos)
})
file_selected2 <- reactive({
shinyFileChoose(input, "file_gene", roots = volumes, session = session)
if (is.null(input$file_gene))
return(NULL)
return(parseFilePaths(volumes, input$file_gene)$datapath)
})
gene_list <- reactive({
if (is.null(file_selected2()))
return()
df <- read.delim(file_selected2(), header = TRUE, stringsAsFactors=FALSE, as.is=TRUE)
genes <- as.character(df[,1])
})
filtrado1 <- reactive({
if (is.null(file_selected2()))
return()
df <- filter(contents(), Gene.refGene %in% gene_list())
})
glist <- reactive({
glist <- isolate(input$genes)
print (glist)
gnames <- gsub(" ","",glist,fixed=TRUE)
names <- unlist(strsplit(gnames,"\n"))
genes <- as.character(names)
})
filtrado2 <- reactive({
if (is.null(glist()))
return()
df <- filter(contents(), Gene.refGene %in% glist())
})
output$tablafilt <- DT::renderDataTable({
if(is.null(contents()))
return()
filtrado <- reactive({
if (!is.null(filtrado1())){
df <- filtrado1()
}
else if (!is.null(filtrado2())){
df <- filtrado2()
}
})
DT::datatable(filtrado())
})
}
shinyApp(ui, server)