R Shiny App可以保存输入以供以后使用

时间:2016-10-13 19:54:35

标签: r shiny

我正在编写一个有许多用户输入的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)

现在,我不想将文件保存为.RDS对象,而是希望将文件保存为.csv文件,这样在R中不精通的用户实际上可以读取文件并在以后更新它。所以我希望输入以下列格式保存为.csv文件(带有示例值):

n, 5
lower,10
upper, 29

如果在R中更容易操作,它也可以格式化为

n, lower, upper
5, 10, 29

最后,在加载文件时,应用程序会要求用户指向文件位置,然后保存应用程序的输入以询问用户将文件保存到的位置。

如何编辑我的代码才能实现这一目标?

1 个答案:

答案 0 :(得分:3)

android:theme="@style/AppTheme"

数据“user_inputs.csv”如下所示:

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)

我添加了列名“inputId”和“value”,因此代码可以更明确。

代码会从原始帖子中更改。要使用.csv文件,需要采用不同的方式加载/保存输入。我认为这种方式是一种简单易行的方法。

注意*当手动输入文件路径输入时,用户需要在文件路径中使用双斜杠“\\”或反斜杠“/”(与R中相同)。