Выбор переключателя для отображения таблицы на следующем выходе - PullRequest
0 голосов
/ 19 сентября 2019

В моем блестящем приложении я загружаю файлы разных типов, которые я хочу обработать, и отображаю результат в разных разделах вывода.Но второй вывод зависит от результата first output .Во втором выводе я фильтрую первую таблицу, используя имена столбцов.Теперь у меня проблема в том, что у некоторых файлов, которые я загружаю, нет столбцов, которые я использую для поднабора для второго вывода, они были перемещены в первую строку, что означает, что после загрузки файла с другими столбцами я должен заменить существующие столбцы.в первом ряду они фильтруют результаты для второго вывода.Вот мое приложение:

library(shiny)
library(DT)


ui<- shinyUI(fluidPage(
  titlePanel("Uploading Files"),
  sidebarLayout(
    sidebarPanel(
      fileInput('file1', 'Choose CSV File',
                accept=c('text/csv',
                         'text/comma-separated-values,text/plain',
                         '.csv')),
      # radio button to show either row or replaced column table
      radioButtons("radio", label = h3("Replace columns"),
                   choices = list("Raw table" = 1, "change columns" = 2), 
                   selected = 1)
    ),
    mainPanel(
      DT::dataTableOutput('contents'),
      DT::dataTableOutput('filtered')
    )
  )
)
)


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

  myData <- reactive({

    inFile <- input$file1
    if (is.null(inFile)) return(NULL)
    data <- read.csv(inFile$datapath, header = TRUE)
    data
  })


  output$contents <- DT::renderDataTable({
    DT::datatable(myData())       
  })

  #Replace columns  reactive event
  replaceColumns <- eventReactive(input$radio,{
    #Change row to column and delete first row
    colnames(myData()) <-myData()[1,]
    df = myData()[-1, ]
    df
  })


  data2<- reactive({
    # Select columns of the dataframe
    df1 <- select(myData(),mpg,cyl,wt)
    df1

  })

  #Output based on either raw or replaced column table
  output$filtered <- DT::renderDataTable({
    DT::datatable(data2())       
  })
}
shinyApp(ui,server)

Как использовать переключатель или если есть другой лучший способ, чтобы, когда я загружаю файл и вижу, что он имеет правильные столбцы, он автоматически отображается в первом выводе, икогда я нажимаю необработанную таблицу В переключателе она переходит к фильтрации и выдает отфильтрованный вывод , и если загруженный файл не имеет правильных столбцов, я нажимаю изменить столбцы , чтобызаменить столбцы первой строкой таблицы, затем отфильтровать и показать отфильтрованный вывод?

Я хочу, чтобы мое приложение работало так: когда я загружаю файл, оно отображается, и если файл имеет правильные столбцы, тоЯ нажимаю raw table на переключателе, который теперь переходит к фильтрации и отображает отфильтрованный вывод во втором выводе, но если я вижу, что загруженный файл содержит неправильные столбцы, я нажимаю c изменить столбцы впереключатель, который заменит столбцы в первой строке, а затем перейдет к отфильтрованным результатам во втором выводе.Я просто имею в виду.Я хочу, чтобы второй выход зависел от того, что я выбрал для переключателя.

1 Ответ

0 голосов
/ 20 сентября 2019

В обоих случаях первый вывод DT показывает таблицу как загруженную (с хорошими или плохими именами).Одним из подходов является тихое исправление имен столбцов:

library(shiny)
library(DT)

ui <- shinyUI(fluidPage(
  titlePanel("Uploading Files"),
  sidebarLayout(
    sidebarPanel(fileInput(
      'file1',
      'Choose CSV File',
      accept = c('text/csv',
                 'text/comma-separated-values,text/plain',
                 '.csv')
    )),
    mainPanel(
      DT::dataTableOutput('contents'),
      DT::dataTableOutput('filtered')
    )
  )
))


server <- function(input, output, session) {
  myData <- reactive({
    inFile <- input$file1
    if (is.null(inFile))
      return(NULL)
    data <- read.csv(inFile$datapath, header = TRUE)
    data
  })

  # Approach 1: fix the data silently
  # Replace column names if needed
  fixData <- reactive({
    req(input$file1)
    df <- myData()

    expectedColumns <- c("mpg", "cyl", "wt")
    if (!all(expectedColumns %in% colnames(myData()))) {
      #Change row to column and delete first row
      colnames(df) <- df[1, ]
      df = df[-1,]
    }  
    df
  })

  output$contents <- DT::renderDataTable({
    DT::datatable(myData())
  })

  data2 <- reactive({
    # Select columns of the dataframe
    df1 <- select(fixData(), mpg, cyl, wt)
    df1
  })

  #Output based on either raw or replaced column table
  output$filtered <- DT::renderDataTable({
    DT::datatable(data2())
  })
}

runApp(list(ui = ui, server = server))

Другой подход заключается в использовании переключателей, как вы запланировали:

library(shiny)
library(DT)

ui<- shinyUI(fluidPage(
  titlePanel("Uploading Files"),
  sidebarLayout(
    sidebarPanel(
      fileInput('file1', 'Choose CSV File',
                accept=c('text/csv',
                         'text/comma-separated-values,text/plain',
                         '.csv')),
      # radio button to show either row or replaced column table
      radioButtons("radio", label = h3("Replace columns"),
                   choices = list("Raw table" = 1, "Change column names" = 2), 
                   selected = 1)
    ),
    mainPanel(
      DT::dataTableOutput('contents'),
      DT::dataTableOutput('filtered')
    )
  )
)
)

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

  myData <- reactive({
    inFile <- input$file1
    if (is.null(inFile)) return(NULL)
    data <- read.csv(inFile$datapath, header = TRUE)
    data
  })

  # Approach 2: click on an radioButton to fix the data

  fixData <- reactive({
    req(input$file1)
    df <- myData()
    if (input$radio == 2) {
      #Change row to column and delete first row
      colnames(df) <- df[1,]
      df = df[-1, ]
    }
    df
  })

  output$contents <- DT::renderDataTable({
    DT::datatable(myData())       
  })

  data2<- reactive({
    # Select columns of the dataframe
    df1 <- select(fixData(),mpg,cyl,wt)
    df1
  })

  #Output based on either raw or replaced column table
  output$filtered <- DT::renderDataTable({
    DT::datatable(data2())       
  })
}
runApp(list(ui=ui,server=server))

...