如何使用csv文件的列名作为输入选择?

时间:2019-01-08 15:00:40

标签: r shiny selectinput

我创建了一个Shiny App,它接受Excel和csv文件作为输入。此外,还应预测可以在上传文件中找到的指标。为了能够在文件中定义右列,用户应该能够选择应预测的列。这就是为什么我要有一个选择输入区域,在该区域中显示文件的所有列名称。但是我找不到正确的解决方案。

到目前为止,在以下我的应用中:

ui:

 ui <- fluidPage(  

  #definition which file input is allowed
  fileInput(
    'file',
     label = h4("Welche Datei soll hochgeladen werden?"),
     multiple= FALSE,
     accept = c(
      'text/csv',
      'text/comma-separated-values,text/plain',
      '.csv',
      '.xlsx'
   )
  ),

服务器:

server <- function(input, output) {

#read data 
data <- reactive({

  validate(need(input$file, ""))
  infile <- input$file

  if (input$type == "1") {
   read.csv(infile$datapath,
           header = input$header,
           sep = input$sep,
           stringsAsFactors = FALSE)
  } else {
  read_xlsx(infile$datapath)
  }    

})

我想到了服务器中的类似问题,但最终无法解决问题:

names <- reactive({
 df <- data()
 if (is.null(df)) return(NULL)

 items=names(df)
 names(items)=items

 return(names(items))

})

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

在内部用户界面中,您应该添加:

selectInput("columnid","Column to forecast",choices=c())

您的服务器应该这样启动: server <- function(session,input, output) {

在服务器内部,在您的反应堆内部的else之后,您可以添加:

updateSelectInput(session,"columnid",choices=colnames(mydata))

请记住将读取的数据称为“ mydata”,并return像这样:

data <- reactive({

  validate(need(input$file, ""))
  infile <- input$file

  if (input$type == "1") {
   mydata=read.csv(infile$datapath,
           header = input$header,
           sep = input$sep,
           stringsAsFactors = FALSE)
  } else {
   mydata=read_xlsx(infile$datapath)
  }
  updateSelectInput(session,"columnid",choices=colnames(mydata))
return(mydata)
})

答案 1 :(得分:0)

您还可以在服务器中使用observeobserve不返回任何内容。与reactive不同,它立即(而不是延迟)响应。最好用于ip / op操作。

ui <- fluidPage (
 selectInput("select_input_id", "INPUT COLUMNS", choices = c())
)



server <- function(input, output) {

  #read data 
  data <- reactive({

    infile <- input$file

    if (input$type == "1") {
     df <- read.csv(infile$datapath,
             header = input$header,
             sep = input$sep,
             stringsAsFactors = FALSE)

     return (df)
    }
  })

observe({
  updateSelectInput(
    session,
    "select_input_id",
    choices = names(data())
  )
)}
}