#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()
afterreq(input$selection)
вrenderTable
блоке. Оттуда, когда вы выбираете несколько файлов, взгляните наinput$selection
и посмотрите сами, как это выглядит. (Спойлер: этоdata.frame
с одной строкой на загруженный файл, поэтомуinput$selection[1]
разумно для первого из 1 или более файлов.)