【问题标题】:Shiny UI: Save the Changes in the Inputs闪亮的 UI:保存输入中的更改
【发布时间】:2014-09-09 16:32:30
【问题描述】:

我有一个很大的问题。我正在尝试运行一个具有很多不同设置的程序,这些设置可以在 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。由于我有很多这样的设置,这可能是个大问题。所以我的问题是:“有没有办法保存我所做的更改?”

谢谢你:)

【问题讨论】:

  • 最坏的情况,每次用户与input$交互时,更新数据库/本地文件中对应的选择一致,不同会话之间可以访问?
  • 一种选择是在 URL 中记录输入值,用户可以将其保存为书签。有关如何实现此功能的更多详细信息,请参阅我对 this question 的回答。如果您在本地提供应用程序,则每次都需要使用相同的端口号调用 runApp 才能使 URL 有效。

标签: r shiny


【解决方案1】:

这是一个棘手的话题。最好有一个客户端解决方案。 HTML5 允许使用本地存储。有许多 javascript 库为此提供了简单的 api。我已经对其中一个进行了包装作为概念证明:

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)
          }
        }
      })
    }
    )
  )

所以演示看起来并不多。在文本输入框中输入一些文本刷新你的浏览器,文本被记住了 hip hurrah !!!该方法可以扩展到任何 R 列表,例如最大 10mb 的对象。我会在包装上再修改一些。

【讨论】:

    【解决方案2】:

    这里是关于如何使用户输入跨会话保持一致的 POC。

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

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

    服务器.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")
      )
    ))
    

    【讨论】:

    • 谢谢!我会尝试一下,稍后与你们分享我的解决方案或我的失败。
    • 这不适用于多个用户。这假设该应用有一个全球用户。
    • @jdharrison,也许创建文件名前缀为username_的文件?你有什么建议吗?
    • @B.Mr.W.这是可能的,但我想你需要某种日志系统
    【解决方案3】:

    抱歉,我花了一些时间。谢谢大家的回答。

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

    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")
                                                    ))
    
    
         ),
    

    【讨论】:

      猜你喜欢
      • 2017-03-15
      • 1970-01-01
      • 2016-07-05
      • 2018-01-03
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 2021-10-20
      相关资源
      最近更新 更多