【问题标题】:Load and save shiny inputs加载和保存闪亮的输入
【发布时间】:2015-12-28 00:45:13
【问题描述】:

我有一个闪亮的大应用程序,有大约 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 或编程一无所知,只是试图优化我的程序,因为每个新的“功能”都会变慢我补充。

【问题讨论】:

  • 如果你打算用 Shiny 写作,最好习惯反应性。没有办法解决它,你越早得到它,你的痛苦就越少。我建议多读几遍文档并编写非常小的程序来玩,看看它是如何工作的。

标签: r shiny


【解决方案1】:

我认为保持这样的设置没有任何问题,但可能有更好的方法,无论如何我都会像我在这里所做的那样将它包装在一个函数中。

这就是你如何实现只在“退出时”写入的方法(也请注意经常不使用的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 文件压缩到一个文件中,这通常不会这样做,但对于这些小示例来说更好。

这不是完美的代码,我没有读取其中的设置并初始化变量,而且我使用了&lt;&lt;- 运算符,有些人对此并不满意。但它应该会帮助你。

更新

这里有一个比较复杂的版本,加载和保存参数,封装起来使用。更好,虽然它可能应该使用 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)
)

产量:

【讨论】:

  • 谢谢!会话对象的“退出”保存为我的程序做了诀窍,而无需重写任何其他内容。但我也喜欢你的例子。我相信这对像我这样的其他新手很有用。几乎感觉你有点被宠坏了,即使没有编程背景,你也可以使用 R 和闪亮。
猜你喜欢
  • 2017-03-15
  • 2016-11-01
  • 1970-01-01
  • 2015-01-17
  • 2017-10-20
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 2019-07-19
相关资源
最近更新 更多