В течение нескольких дней я пытался разработать приложение для учебных целей и задал много вопросов в SO.Самым последним был этот , и это помогло разработать код, который у меня есть сейчас.
Теперь я пытаюсь создать для приложения кнопку загрузки (используя часть примера с datacamp.com) и не получаю желаемый результат.Новые адаптации: (i) добавление выделения для расширения файла (например, csv или tsv) и (ii) кнопка загрузки в теле приложения, чтобы загрузить набор данных, выбранный с помощью входов на боковой панели.
Я понимаю, что в браузере RStudio есть проблемы с кнопкой загрузки, поэтому я запускаю приложение на Chrome.Тем не менее, мой загружаемый файл не является ни csv, ни tsv, но не показывает никакого сходства с набором данных, когда я пытаюсь открыть его (он открывается как файл HTML на моем компьютере).
Я полагаю, что у меня может бытьпроблемы с реактивами на сервере или созданной функцией для работы с несколькими пунктами меню (convertMenuItem
) * на боковой панели могут не работать с добавлением опции загрузки.
* Мне нужно понять это более тщательно.Кстати, я благодарю @phalteman.Эта функция была действительно полезной.
РЕЗЮМЕ : вывод для загрузки не желаемый, а файл HTML.Вместо этого я хочу выбрать тип файла (например, CSV или TSV) и загрузить набор данных соответственно с выбранными входами на боковой панели.Пока что, похоже, это не работает.
Вот код, который я пытаюсь отладить:
library(shiny)
library(ggplot2)
library(dplyr)
library(shinydashboard)
rm(list=ls()); gc()
#function to adaptate menuItem
convertMenuItem <- function(mi,tabName) {
mi$children[[1]]$attribs['data-toggle']="tab"
mi$children[[1]]$attribs['data-value'] = tabName
mi
}
#functions to order the plot
reorder_within <- function(x, by, within, fun = mean, sep = "___", ...) {
new_x <- paste(x, within, sep = sep)
stats::reorder(new_x, by, FUN = fun)
}
scale_x_reordered <- function(..., sep = "___") {
reg <- paste0(sep, ".+$")
ggplot2::scale_x_discrete(labels = function(x) gsub(reg, "", x), ...)
}
#example data
sample_data = data.frame(Company_Name=c("Company 1","Company 2","Company 3",
"Company 1","Company 2","Company 3",
"Company 1","Company 2","Company 3"),
Profits_MM = c(20,100,80,
45,120,70,
50,110,130),
Sales_MM = c(200,800,520,
300,1000,630,
410,1150,1200),
Year=c(2016,2016,2016,
2017,2017,2017,
2018,2018,2018))
###app code###
# UI
ui <- dashboardPage(
dashboardHeader(title = "Dashboard Test"),
dashboardSidebar(
sidebarMenu(
convertMenuItem(menuItem("Data Selection", tabName = "dc", icon = icon("dashboard"),
checkboxGroupInput(inputId = "sel_com",
label = "Company Selection:",
choices = c("Company 1","Company 2","Company 3"),
selected = "Company 1"),
selectInput(inputId = "y",
label = "Performance Variable",
choices = c("Profits (in Millions)" = "Profits_MM",
"Sales (in Millions)" = "Sales_MM"),
selected = "Profits_MM"),
sliderInput("year","Year Selection:",
min=2016,
max=2018,
value=c(2017,2018),
step=1),
radioButtons(inputId = "filetype",
label = "Select filetype:",
choices = c("csv", "tsv"),
selected = "csv")), tabName="dc")
)
),
dashboardBody(
tabItems(
# First tab content
tabItem(tabName = "dc",
fluidRow(column(width=12,box(plotOutput("barplot"))),
downloadButton(outputId = "download_data",
label = "Download data")
)
)
)
)
)
# Server
server <- function(input, output, session) {
companies_sel <- reactive({
req(input$sel_com)
sample_data_gg = filter(sample_data, Company_Name %in% input$sel_com)
# print(sample_data_gg)
sample_data_gg
})
year_sample <- reactive({
req(input$year)
sample_data_gg = sample_data
if((input$year[2] - input$year[1])>1){
Years = seq(input$year[1],input$year[2])
sample_data_gg = filter(companies_sel(), Year %in% Years)
}
if((input$year[2] - input$year[1])==1){
sample_data_gg = filter(companies_sel(), Year %in% input$year)
}
# print(sample_data_gg)
sample_data_gg
})
output$barplot = renderPlot({
sample_data_gg = year_sample()
y <- input$y
ggplot(data = sample_data_gg, aes(x=reorder_within(Company_Name, get( y ), Year), y = get( y ))) +
geom_col(position="dodge", fill="darkred") +
facet_wrap(Year~., scales = "free") +
scale_x_reordered() +
theme(axis.text.x = element_text(angle = 60, hjust = 1))
})
# Download file as written in a datacamp example
output$download = downloadHandler(filename =
function(){paste("company_obs", input$filetype, sep=".")},
content = function(file) {
if(input$filetype == "csv"){
write_csv(year_sample(), path = file)
}
if(input$filetype == "tsv"){
write_tsv(year_sample(), path = file)
}
}
)
}
app = shinyApp(ui, server)
runApp(app, launch.browser = TRUE)