Shiny如何动态选择导入数据集的列以进行进一步分析

Nis*_*ant 3 r shiny

我正在尝试一个小巧的应用程序,其中我从本地目录加载CSV文件,然后从数据框中选择特定列,并使用此子集化数据框进行进一步的数据分析.

library(shiny)

# Define UI for application that draws a histogram
ui <- fluidPage(

   # Application title
   titlePanel("Old Faithful Geyser Data"),

   # Sidebar with a slider input for number of bins 
   sidebarLayout(
      sidebarPanel(
        fileInput("dataset", "Choose CSV File",
                  multiple = TRUE,
                  accept = c("text/csv",
                             "text/comma-separated-values,text/plain",
                             ".csv")),
        # Include clarifying text ----
        #helpText(em("Note: This app requires file in csv format only!!")),
        helpText(em("Note:Select all the inputs and click on button as given below to exectute the app")),
        # Input: Checkbox if file has header ----
        checkboxInput("header", "Header", TRUE),
        # Input: Select separator ----
        radioButtons("sep", "Separator",
                     choices = c(Comma = ",",
                                 Semicolon = ";",
                                 Tab = "\t"),
                     selected = ","),
        selectInput("select", "Select columns to display", names(datasetInput), multiple = TRUE),
        actionButton("update", "Update Data set", class = "btn-primary",style='padding:4px; font-size:120%')
      ),

      # Show a plot of the generated distribution
      mainPanel(
        h2('The Mydata'),
        dataTableOutput('mytable')
      )
   )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

  datasetInput <- eventReactive(input$update, {
    validate(need(input$dataset != "", "Please select a data set in csv format only!!!"))# custom error message on opening the app
    read.csv(input$dataset$datapath,
             header = input$header,
             sep = input$sep)
  }, ignoreNULL = FALSE)

  dataset <- reactive({
    df_input<-datasetInput()
    df_input$x<-NULL
    df_input
  })

   output$mytable = renderDataTable({
     columns = names(dataset)
     if (!is.null(input$select)) {
       columns = input$select
     }
     dataset[,columns,drop=FALSE]
   })
}

# Run the application 
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

看一些SO答案;得到一些; 一个如下:

闪亮的允许用户选择要显示的列

但是这个答案,数据集是预定义的; 我希望用户下载自己的数据集.

我收到以下错误:

lapply中出错(obj,function(val){:找不到对象'datasetInput'

我觉得我必须使用observeEvent函数?

Chr*_*olk 5

这是一个变种server.R; 与akrun一起使用它ui.R.这个动态地适应过滤选项,并允许您通过添加列名来添加列,即使单击按钮后也是如此.

library(shiny)
library(DT)

server <- function(session, input, output) {

  data <- reactive({
    req(input$dataset)
    read.csv(input$dataset$datapath, header = input$header,sep = input$sep)
    })

  filtereddata <- eventReactive({
      input$update
      data()
    },  {
    req(data())
    if(is.null(input$select) || input$select == "")
      data() else 
        data()[, colnames(data()) %in% input$select]
  })

  observeEvent(data(), {
    updateSelectInput(session, "select", choices=colnames(data()))
  })

  output$mytable  <- renderDataTable(filtereddata())

} 
Run Code Online (Sandbox Code Playgroud)