一个保存输入以供以后使用的 R Shiny 应用程序

7

我正在编写一个Shiny应用程序,其中包含许多用户输入,因此我希望有一个选项,允许用户保存他们的输入并在以后使用时加载它们。我能够按照在网上找到的示例完成这个任务,但现在我想请求一些帮助来改变代码功能。以下是代码:

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)

现在,我希望将文件保存为 .csv 格式,这样不熟悉 R 语言的用户也可以读取并在以后更新它。以下是想要保存的输入格式(带有示例值):

n, 5
lower,10
upper, 29

如果在 R 中更容易操作,也可以将其格式化为
n, lower, upper
5, 10, 29

最后,在加载文件时,应用程序最好询问用户指向文件位置,然后在保存应用程序的输入时,应用程序会询问用户要将文件保存到哪个位置。
我该如何编辑我的代码来实现这一点?

1
http://shiny.rstudio.com/articles/persistent-data-storage.html - Carl
2
@Carl 我更倾向于将人们指向原始文章的来源,即http://deanattali.com/blog/shiny-persistent-data-storage/,因为它有一些RStudio版本没有的更新。 - DeanAttali
1
抱歉,我不知道它在互联网上被重复发布了。 - Carl
1
我想知道你是否可以使用这个链接代替。http://shiny.rstudio.com/articles/bookmarking-state.html。`shinyApp(ui,server,enableBookmarking =“url”)`他们所要做的就是将页面加为书签以保留他们的设置。 - Brandon Bertelsen
1个回答

8
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相同)。

我有一个快速问题@easports611:当我在单独的R文件中使用您的代码并更改输入字段时,它完美地工作。但是,当我将其包含在我的模块中时,它会出现错误。我的输入ID略有不同:ns('project_id')而不仅仅是'project_id',如果这是问题,是否有解决方法? - Lea7885

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接