Как я могу использовать имена столбцов CSV-файла в качестве выбора ввода?

Я создал приложение Shiny, которое принимает файлы 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))

})

Спасибо за любую помощь!


person nississippi    schedule 08.01.2019    source источник


Ответы (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)
})
person Ricardo Fernandes Campos    schedule 08.01.2019
comment
Спасибо за быстрый ответ. Что вы имеете в виду под последней фразой? Где и как вызывать mydata? - person nississippi; 08.01.2019
comment
У меня есть еще один вопрос. Я только что понял, что теперь приложение действительно дает мне раскрывающиеся возможности по желанию. Однако, когда я пытаюсь переключиться на вторую или третью запись, она всегда возвращается к первой. Поэтому я не могу переключиться на другую запись. Вы знаете, что здесь не так? - person nississippi; 09.01.2019
comment
Это означает, что ваш updateSelectInput вызывается каждый раз, когда вы пытаетесь выбрать столбец. Вам нужно поместить его в блок кода, который запускается только при чтении файла. Я предполагаю, что вы вызываете data() внутри некоторого наблюдаемого события или eventReactive, что вызывает переоценку updateSelectInput снова и снова. - person Ricardo Fernandes Campos; 09.01.2019

Вы также можете использовать observe на сервере. observe ничего не возвращает. В отличие от 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())
  )
)}
}
person theairbend3r    schedule 28.09.2019