首页 文章

加载并保存闪亮的输入

提问于
浏览
1

我有一个大的闪亮的应用程序与大约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 回答

  • 3

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

    这里是你如何实现只写"on exit"(也请注意 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

相关问题