r shiny — отображать фрейм данных после загрузки

#r #shiny

#r #блестящий

Вопрос:

Я пытаюсь создать приложение для привязки записей в R shiny. Я уже некоторое время использую R, но новичок в shiny. Моя проблема в том, что я изо всех сил пытаюсь понять, как отобразить файл, который я загружаю через fileInput . Мой код приведен ниже.

 library(shiny)
library(shinydashboard)
  

пользовательский интерфейс

 ui <- dashboardPage(
  dashboardHeader(title = "Record Linkage App"),
  dashboardSidebar(
    sidebarMenu(
      ## Tab 1 -- Specify Task
      menuItem("Select Task And Upload Files", tabName = "task", icon = 
    icon("file-text-o")),
  ## Tab 2 -- View Raw Data Files
  menuItem("View Raw Data", tabName = "raw", icon = icon("file-text-o")),
  ## Tab 3 -- View Processed Data Files
  menuItem("View Processed Data", tabName = "processed", icon = icon("file-text-o")),
  ## Tab 4 -- Select Training Set
  menuItem("Select Training Set", tabName = "mltrain", icon = icon("file-text-o")),
  ## Tab 5 -- View Weight amp; Probabilities (choose which chart to view or both?)
  menuItem("Visualize Distributions", tabName = "distributions", icon = icon("bar-chart-o")),
  ## Tab 6 -- View Results (review, match and trash files--need to be able to choose dataset)
  ## Want to be able to add checkboxes to select rows for inclusion in deletion later on
  menuItem("View Result Files", tabName = "fileview", icon = icon("file-text-o"))

)), # close dashboard sidebar

  #### Dashboard Body starts here

  dashboardBody(
    tabItems(
  ### Specify Task amp; Upload Files Tab
  tabItem(tabName = "task",
          radioButtons("task", "Select a Task:", c("Frame Deduplication", "Frame Record Linkage")),
          fileInput("selection", "Upload Files:", multiple = T, 
                    accept = c(".xls", "text/csv", "text/comma-separated-values, text/plain", ".csv")),
          helpText(paste("Please upload a file.  Supported file types are:  .txt, .csv and .xls"))

          ), # close first tabItem

  tabItem(tabName = "raw",
          helpText(paste("This tab displays the raw, unprocessed data frames selected in the previous tab.")),
          mainPanel(
            tableOutput("contents")

          )

) # close tabItems

  ) # close dashboardBody
) #close dashboardpage
  

)

сервер

 server <- function(input, output, session) {
   output$contents <- renderTable({
      req(input$file1)
      read.csv(input$file1$datapath)

  })
}

shinyApp(ui, server)
  

Я хотел бы иметь возможность отображать таблицу на вкладке «raw».

Мой вопрос: 1. Если я просто хочу отобразить таблицу, должна ли она быть reactive ?
2. Как input$file1$datapath войти в renderTable ?

Любые предложения или рекомендации будут оценены. Спасибо.

Комментарии:

1. В справочном документе для fileInput приведен пример, который точно показывает, как использовать данные после загрузки. Он немного устарел (например, следует использовать req(input$file1) вместо is.null(...) ), но все равно должен работать нормально. (Также доступно с ?fileInput на вашей локальной консоли.)

2. Проблема в том, что я хочу отобразить таблицу данных на второй вкладке, а не на первой. Приведенный пример не работает

3. server Компоненту не важно, на какой вкладке содержится элемент пользовательского интерфейса. Если вы напишете output$contents <- renderTable(...) в любом месте внутри server , то это будет отображаться на вашей второй вкладке, "raw" . Вы говорите, что это не работает, но не показываете код, который пытается это сделать, пожалуйста, обновите свой server код (который включает в себя renderTable ).

4. Должно быть, я пропустил это в своих руководствах. Ценная информация. Я обновил код до того, что я запустил, чтобы включить renderTable

Ответ №1:

Я думаю, вы воспринимаете документацию слишком буквально: вы должны ссылаться input$selection , а не input$file1 . Я изменил ваш серверный компонент на этот, и это сработало:

 server <- function(input, output, session) {
  output$contents <- renderTable({
    req(input$selection)
    read.csv(input$selection$datapath)
  })
}
  

Кстати: хотя это и не наносит вреда, вы используете mainPanel , который обычно используется в приложении, отличном от панели мониторинга, вместе с shiny::sidebarLayout . Однако, поскольку вы используете shinydashboard , в этом нет необходимости, и вы можете уменьшить последнее tabItem до просто

       tabItem(tabName = "raw",
              helpText(paste("This tab displays the raw, unprocessed data frames selected in the previous tab.")),
              tableOutput("contents")
              )
  

Комментарии:

1. о, я понимаю. Большое спасибо. Я предполагаю, что я использовал input$file1 , потому что я планировал иметь возможность загружать несколько файлов одновременно, отсюда multiple = T .

2. Возможно, помогло бы добавить browser() after req(input$selection) в renderTable блоке. Оттуда, когда вы выбираете несколько файлов, взгляните на input$selection и посмотрите сами, как это выглядит. (Спойлер: это data.frame с одной строкой на загруженный файл, поэтому input$selection[1] разумно для первого из 1 или более файлов.)