我有一个大闪亮的应用程序,有大约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或编程一无所知,只是试图优化我的程序,因为它随着每个新的“功能”变慢我补充说。
答案 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.R
和server.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)
)
产量: