R Блестящее приложение, которое сохраняет входные данные для последующего использования

#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’, если это проблема, есть ли способ обойти ее?