#r #shiny
#r #блестящий
Вопрос:
Я пишу блестящее приложение, которое будет иметь много пользовательских вводов, и поэтому я хотел бы иметь опцию, позволяющую пользователю сохранять свои вводимые данные и загружать их обратно для последующего использования. Я смог сделать это, следуя примеру, который я нашел в Интернете, но теперь я хотел бы попросить помощи в изменении функциональности кода. Вот код:
library(shiny)
ui <- shinyUI(fluidPage(
br(),
actionButton("load_inputs", "Load inputs"),
br(),
br(),
numericInput("n", "Number",min = 1, value = 5),
numericInput("upper", "Upper",min = 0, max = 100, value = 15),
numericInput("lower", "Lower",min = 0, max = 100, value = 5),
actionButton('save_inputs', 'Save inputs')
))
server <- shinyServer(function(input, output,session) {
switch(Sys.info()[['sysname']],
Windows= {setwd(file.path(Sys.getenv("USERPROFILE"),"Desktop",fsep="\"))},
Mac = { setwd("~/Desktop/")})
observeEvent(input$load_inputs,{
if(!file.exists('inputs.RDS')) {return(NULL)}
savedInputs <- readRDS('inputs.RDS')
inputIDs <- names(savedInputs)
inputvalues <- unlist(savedInputs)
for (i in 1:length(savedInputs)) {
session$sendInputMessage(inputIDs[i], list(value=inputvalues[[i]]) )
}
})
observeEvent(input$save_inputs,{
saveRDS( reactiveValuesToList(input) , file = 'inputs.RDS')
})
})
shinyApp(ui=ui,server=server)
Теперь, вместо того, чтобы сохранять файл как объект .RDS, я хотел бы сохранить файл как файл .csv, чтобы пользователь, который не разбирается в R, мог фактически прочитать файл и обновить его позже, если захочет. Поэтому я хотел бы, чтобы входные данные были сохранены в виде CSV-файла в следующем формате (с примерами значений).:
n, 5
lower,10
upper, 29
если проще манипулировать в R, он также может быть отформатирован как
n, lower, upper
5, 10, 29
Наконец, при загрузке файла было бы неплохо, чтобы приложение попросило пользователя указать местоположение файла, а затем при сохранении входных данных для приложения спросить пользователя, в какое место сохранить файл.
Как я могу отредактировать свой код, чтобы достичь этого?
Комментарии:
1. shiny.rstudio.com/articles/persistent-data-storage.html
2. @Carl Я предпочитаю указывать людям на первоисточник статьи по адресу deanattali.com/blog/shiny-persistent-data-storage потому что в нем есть некоторые обновления, которых нет в версии RStudio
3. Извините, я не знал, что это было дважды размещено в интернете
4. Интересно, могли бы вы просто использовать это вместо этого. shiny.rstudio.com/articles/bookmarking-state.html .
shinyApp(ui, server, enableBookmarking = "url")
Все, что им нужно сделать, это добавить страницу в закладки, чтобы сохранить свои настройки.
Ответ №1:
library(shiny)
ui <- shinyUI(fluidPage(
textInput(inputId = 'inputsLocation', label = 'Inputs Location', value = "~/Desktop/user_inputs.csv"),
actionButton('load_inputs', 'Load inputs'),
br(),
br(),
numericInput("n", "Number",min = 1, value = 5),
numericInput("upper", "Upper",min = 0, max = 100, value = 15),
numericInput("lower", "Lower",min = 0, max = 100, value = 5),
actionButton('save_inputs', 'Save inputs')
))
server <- shinyServer(function(input, output,session) {
observeEvent(input$load_inputs, {
# Load inputs
uploaded_inputs <- read.csv(input$inputsLocation)
# Update each input
for(i in 1:nrow(uploaded_inputs)){
updateNumericInput(session,
inputId = uploaded_inputs$inputId[i],
value = uploaded_inputs$value[i])
}
})
observeEvent(input$save_inputs, {
# Define inputs to save
inputs_to_save <- c('n', 'upper', 'lower')
# Declare inputs
inputs <- NULL
# Append all inputs before saving to folder
for(input.i in inputs_to_save){
inputs <- append(inputs, input[[input.i]])
}
# Inputs data.frame
inputs_data_frame <- data.frame(inputId = inputs_to_save, value = inputs)
# Save Inputs
write.csv(inputs_data_frame, file = input$inputsLocation, row.names = FALSE)
})
})
shinyApp(ui=ui,server=server)
Данные «user_inputs.csv» выглядят следующим образом:
"inputId","value"
"n",5
"upper",7
"lower",4
Я добавил имена столбцов «inputId» и «value», чтобы код мог быть более четким.
Код изменен по сравнению с вашим первоначальным сообщением. Для использования файла .csv требуется другой способ загрузки / сохранения входных данных. Я думаю, что этот способ — простой способ сделать это, которому относительно легко следовать.
Примечание * При вводе пути к файлу вручную пользователю необходимо использовать либо двойную косую черту «\», либо обратную косую черту «/» в пути к файлу (так же, как в R).
Комментарии:
1. У меня есть небольшой вопрос @easports611: ваш код отлично работает, когда я использую его в отдельном R-файле и изменяю поля ввода. Тем не менее, оно выходит из строя, когда я включаю его в свой модуль. Мой идентификатор входных данных немного отличается: ns (‘project_id’) вместо просто ‘project_id’, если это проблема, есть ли способ обойти ее?