фильтровать данные в блестящем с помощью textArea или путем загрузки файла - PullRequest
0 голосов
/ 13 апреля 2019

Я хочу создать блестящее приложение, которое загружает файл с помощью 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) 
...