是否有可能使用尚未在ShinyWidgets的功能pickerInput中作为“选择”上传的数据框列的唯一值?

时间:2019-05-20 14:50:07

标签: r user-interface datatable shiny

我正在构建一个具有光泽的交互式应用程序。我正在使用功能pickerinput来选择一些过滤以应用于必须由用户上传的数据框。无论如何,是否有将数据框的一列的唯一值传递给该函数的参数“ choices”?

要上传的数据框:

X | Y | Z

SNP | 1 | A

del | 6 | T

SNP | 5 | G

del | 3 | G

ins | 5 | A

del | 8 | T

SNP | 3 | G

这是我编写的代码:

library(shiny)
library(DT)    #  for data tables
library(dplyr)
library(shinyWidgets)

ui <- fluidPage(

    sidebarPanel(

        pickerInput("X", "X",
                    choices = unique(df$X) ),

    mainPanel(
      dataTableOutput("contents")
    )
))

server <- function(input, output) {

  output$contents <- renderDT({
    req(input$file1)
    df <- read.delim(input$file1$datapath,
                     header = TRUE,
                     sep = '\t')

    df <- df %>%  
      filter( X == input$X)
    return(df)

  })
}

shinyApp(ui, server)

因此,在上表之后,用户将拥有一个选择框,其选择将是“ X”列的行名称,即:SNP,del,ins。

我已经运行了这段代码,但自己写了选择(choices = c('SNP','del','ins')),但是我不知道如何使程序从上载的表中获取选择

非常感谢

1 个答案:

答案 0 :(得分:1)

updatePickerInput提供了一种实现此目的的方法:

library(shiny)
library(DT)
library(dplyr)
library(shinyWidgets)

fileData <-
  c(
    "X\tY\tZ",
    "SNP\t1\tA",
    "del\t6\tT",
    "SNP\t5\tG",
    "del\t3\tG",
    "ins\t5\tA",
    "del\t8\tT",
    "SNP\t3\tG"
  )


if(!file.exists("test_file.tsv")){
  writeLines(fileData, "test_file.tsv")
}

ui <-
  fluidPage(sidebarPanel(
    fileInput(
      "file1",
      "Choose TSV File",
      accept = c("text/tab-separated-values,text/plain", ".tsv")
    ),
    pickerInput("X", "X", choices = NULL)
  ),
  mainPanel(dataTableOutput("contents")))

server <- function(input, output, session) {
  DF <- reactive({
    req(input$file1)

    DF <- read.delim(input$file1$datapath,
                     header = TRUE,
                     sep = '\t')

  })

  observeEvent(DF(), {
    req(DF())
    updatePickerInput(session, inputId = "X", choices = unique(DF()$X))
  })

  filtered_DF <- reactive({
    req(input$X)
    DF() %>% filter(X == input$X)
  })

  output$contents <- renderDT({
    filtered_DF()
  })
}

shinyApp(ui, server)