加载并保存闪亮的输入

时间:2015-12-28 00:45:14

标签: r shiny

我有一个大闪亮的应用程序,有大约60种不同的输入,它仍然在增长。由于我经常使用这个程序,我希望将设置存储到下次运行应用程序时。我制作了一个看起来像这样的csv文件:

input,value
input_a,10
input_b,#FFF000
input_c,hide
input_d,65400

我在ui.R和server.R中加载了csv文件(不知道为什么我要加载它两次......)

config <- data.frame(lapply(read.csv(".//config.csv"), as.character), stringsAsFactors = FALSE)

并有这样的输入

sliderInput(
"input_a",
"Number of cats:",
min = 1,max = 50,
value = config[config$input %in% "input_a", "value"]
)

在server.R中,我让输入更改替换表中的值,并将表保存到文件

observe({
config[config$input %in% "input_a", "value"] <- input$input_a
config[config$input %in% "input_b", "value"] <- input$input_b
config[config$input %in% "input_c", "value"] <- input$input_c
config[config$input %in% "input_d", "value"] <- input$input_d

write.table(config, file = ".//config.csv", col.names = TRUE, row.names = FALSE, quote = FALSE, sep = ",")
})

我确信有更好的方法可以做到这一点,我搜索并检查了其他类似的问题,我从dget和dput开始,但后来决定将所有相关设置放在一个简单的文件中。对不起,如果我在搜索时错过了最相关的问题。

我不喜欢这个是程序在加载程序时保存表,然后再进行任何输入更改。

每次运行程序时,如何摆脱不必要的保存? 我不明白闪亮的所有“反应性”,对我来说仍然有点复杂,我对R或编程一无所知,只是试图优化我的程序,因为它随着每个新的“功能”变慢我补充说。

1 个答案:

答案 0 :(得分:3)

我没有看到保持这样的设置有任何问题,但可能有更好的方法,并且在任何情况下我都会将它包装在像我在这里做的函数中。

以下是您在“退出”时仅实现写入的方式(另请注意通常未使用的session参数):

library(shiny)
settingsdf <- data.frame(input=c("input_a","input_b","input_c"),
                         value=c(10,"#FF000","hide"),
                         stringsAsFactors=F)
setSetting <- function(pname,pval){
  idx <- which(settingsdf$input==pname)
  if (length(idx)==1){
    print(pval)
    settingsdf[ idx,2] <<- pval
  }
}
shinyApp(
  ui = fluidPage(
    selectInput("region", "Region:", choices = colnames(WorldPhones)),
    plotOutput("phonePlot")
  ),
  server = function(input, output, session) {


    output$phonePlot <- renderPlot({
      if (length(input$region)>0){
        setSetting("input_a",input$region)
        barplot(WorldPhones[,input$region]*1000, 
                ylab = "Number of Telephones", xlab = "Year")
      }
    })
    session$onSessionEnded(function() {
      write.csv(settingsdf,"settings.csv")
    })
  },
  options = list(height = 500)
)

请注意,我正在将ui.Rserver.R文件压缩到一个通常不会完成的文件中,但对于这些小例子来说更好。

这不是完美的代码,我没有读取设置并初始化变量,我使用<<-运算符,有些人皱眉。但它应该可以帮助你。

更新

这是一个更复杂的版本,可以加载和保存参数,并封装它们以供使用。它更好,虽然它可能应该使用S3对象......

library(shiny)

# Settings code

settingsdf <- data.frame(input=c("input_a","region"),
                        value=c(10,"Asia"),stringsAsFactors=F)
setfname <- "settings.csv"

setSetting <- function(pname,pval){
  idx <- which(settingsdf$input==pname)
  if (length(idx)==1){
    settingsdf[ idx,"value"] <<- pval
  }
}
getSetting <- function(pname){
  idx <- which(settingsdf$input==pname)
  if (length(idx)==1){
    rv <- settingsdf[ idx,"value"]
    return(rv)
  } else {
    return("")
  }
}
readSettings <- function(){
  if (file.exists(setfname)){
    settingsdf <<- read.csv(setfname,stringsAsFactors=F)
  }
}
writeSettings <- function(){
  write.csv(settingsdf,setfname,row.names=F)
}

# ShinyApp

shinyApp(
  ui = fluidPage(
    selectInput("region","Region:", choices = colnames(WorldPhones)),
    plotOutput("phonePlot")
  ),
  server = function(input, output, session) {
    readSettings()
    vlastinput <- getSetting("region")
    if (vlastinput!=""){
        updateSelectInput(session, "region", selected = vlastinput )
    }
    output$phonePlot <- renderPlot({
      if (length(input$region)>0){
        vlastinput <- input$region
        setSetting("region",vlastinput)
        barplot(WorldPhones[,input$region]*1000, 
                ylab = "Number of Telephones", xlab = "Year")
      }
    })
    session$onSessionEnded(function() {
      writeSettings()
    })
  },
  options = list(height = 500)
)

产量:

enter image description here