闪亮的用户界面:保存输入中的更改

时间:2014-09-09 16:32:30

标签: r shiny

我有一个很大的问题。我试图运行一个具有相当多设置的程序,可以在ui中设置。在我的情况下,用户可能需要多次使用相同的设置运行程序。我的问题是,如果刷新或重新启动UI,则所有内容都将设置为默认值。例如:

numericInput("1", 
            label = h4("...."),
                                        4,
                                        min=1, 
                                        max=100, 
                                        step=1 
                                        ),
                           br(),
                           numericInput("2", 
                                        label = h4("..."),
                                        1000000,
                                        min=1, 
                                        max=100000000, 
                                        step=1
                                        )

如果我设置了numericInput" 1"到7,并重新运行程序默认为4.由于我有相当多的设置,这可能是一个相当大的buzzkill。所以我的问题是:"有没有办法保存我所做的更改?"

谢谢你:)

3 个答案:

答案 0 :(得分:5)

这是一个棘手的主题。最好有一个客户端解决方案。 HTML5允许使用本地存储。有许多javascript库都有简单的api#s。我把其中一个包装作为概念的证据:

devtools::install_github("johndharrison/shinyStorage")
library(shinyStorage)
library(shiny)

runApp(
  list(
    ui = fluidPage(
      addSS(),
      uiOutput("textExample")
      )
    , server = function(input, output, session){
      ss <- shinyStore(session = session)
      output$textExample <- renderUI({
        myVar <- ss$get("myVar")
        if(is.null(myVar)){
          textInput("textID", "Add some text to local storage")
        }else{
          textInput("textID", "Add some text to local storage", myVar)          
        }
      })

      observe({
        if(!is.null(input$textID)){
          if(input$textID != ""){
            ss$set("myVar", input$textID)
          }
        }
      })
    }
    )
  )

所以演示看起来并不多。在textInput框中输入一些文本刷新浏览器,文字记住臀部欢呼!该方法可以扩展到任何R列表,例如大小达10mb的对象。我会在包装上再修补一些。

答案 1 :(得分:3)

以下是如何使用户输入跨会话保持一致的POC。

DPUT和DGET是使其工作的两个命令。因此,您最终得到一个存储输入变量值的本地文件。这里我只是使输入$ dataset变量保持一致。如果你有更多的变量,我认为你可以使用更多的高级命令甚至数据库..但这适用于一个是相当容易的。

由于我在server.R和ui.R之间进行了几次迭代,我可能需要通过命令行甚至构建一次初始化文件您的代码中有一些逻辑用于检查文件是否存在,如果不存在,则创建一个具有某个默认值的新文件。

server.R

shinyServer(function(input, output) {

  datasetInput <- reactive({
    switch(input$dataset,
           "rock" = rock,
           "pressure" = pressure,
           "cars" = cars)
  })

  output$summary <- renderPrint({
    dataset <- datasetInput()
    summary(dataset)
    dput(input$dataset, "inputdata_dataset")
  })

  output$view <- renderTable({
    head(datasetInput(), n = input$obs)
  })
})

ui.R

library(shiny)
shinyUI(pageWithSidebar(
  headerPanel("Shiny Text"),
  sidebarPanel(
    selectInput("dataset", "Choose a dataset:", 
                choices = c("rock", "pressure", "cars"),
                selected = dget("inputdata_dataset")),
    numericInput("obs", "Number of observations to view:", 10)
  ),
  mainPanel(
    verbatimTextOutput("summary"),
    tableOutput("view")
  )
))

答案 2 :(得分:0)

抱歉,我花了一段时间。谢谢你的所有答案。

我找到了一个解决方法(我只会发布我的代码的相关部分)。我找到了使用conditionalpanel的解决方案。在我的应用程序中,用户必须在开始计算之前定义设置,并且至关重要的是他首先保存它们(各种原因,主要是可重复性)。所以我为计算中的每一步创建了一个tabpanel,我非常简单的解决方案是每个tabpanel都依赖于save按钮。结果是用户甚至可以在他没有保存设置之前开始计算。

shinyUI(navbarPage(title=div(img(src="---", height=72, width=72, align="left")), theme ="bootstrap.css", fluid=T,




                 tabPanel("Startseite",
tags$head(tags$script(HTML('
      Shiny.addCustomMessageHandler("jsCode",
        function(message) {
          console.log(message)
          eval(message.code);
        }
      );
    '))),

                        actionButton("Ja",
                                     label="Neue Berechnung beginnen",
                                     icon("upload",lib="font-awesome")),

                        actionButton("Nein",
                                     label="Bestehende Berechnung laden",
                                     icon("upload",lib="font-awesome"))),

               tabPanel("Einstellungen", progressInit(),

                        conditionalPanel(condition="input.Ja > 0",

                                         wellPanel(actionButton("save",
                                                                label="Einstellungen speichern",
                                                                icon("save",lib="font-awesome")
                                                                ),
                                                   br(),
                                                   br(),
                                                   navlistPanel("Einstellungen",



tabPanel("Interne Kalibrierung",
     conditionalPanel(condition="input.save> 0",

                      wellPanel(actionButton("freqbutton", "Frequenzschätzung durchführen"),
                                plotOutput("freqPlot")
                                ),


                                      wellPanel(actionButton("intthresbutton", "Berechnung der internen Threshold"),
                                                dataTableOutput("IntTable")
                                                ))


     ),