【问题标题】:R Shiny Refresh App Keep Same TabR Shiny Refresh App 保持相同的标签
【发布时间】:2017-04-28 19:18:52
【问题描述】:

我想让 Shiny 应用记住在 session$reload()(刷新页面)时选择了哪个选项卡以清除所有输入除了在 a 中选择的当前选项卡的值navbarPage().

我想到的唯一想法,虽然我不知道如何实现,但将一个全局变量 tabIndicator 分配为当前选择的选项卡的值(你如何获得这个值?) ,然后在刷新时,rm() 全局环境中除tabIndicator 之外的所有变量,并在navbarPage() 中设置selected = tabIndicator

我怎样才能做到这一点?

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    你有两个选择,都超出了闪亮的基础。

    1. 您可以使用 cookie。每次进入新标签时,向 javascript 发送一条消息并设置一个 cookie。应用初始化时,检查 cookie 是否存在,如果已设置,则读取其值并切换到相应的选项卡

    2. 使用 shinyStore 包,它使您能够利用 HTML5 的本地存储(但这不适用于旧浏览器,因为 HTML5 相对较新)

    我现在没有时间提供完整的代码,但希望这会有所帮助

    【讨论】:

      【解决方案2】:

      我认为这是可行的,但很棘手。问题是session$reload() 相当于点击浏览器中的刷新按钮,因此您正在创建一个新会话,并丢失所有上下文。我想您可以使用 cookie 以某种方式做到这一点,但我建议您使用 actionButton 来重置您使用 updateWhatever 的所有输入,而不是实际执行 session$reload()

      【讨论】:

      • 可以将actionButton 编程为不仅清除所有输入而且还清除输出吗?比如输出表对象?
      【解决方案3】:

      我能够使用全局变量来解决这个问题。

      我将此代码放在我的应用程序的顶部(在uiserver 之前)

      # Clear global environment except 'currentTab'
      rm(list=setdiff(ls(), 'currentTab'))
      
      # If current tab exists, restore to that tab. Otherwise, start at home screen
      if(!exists('currentTab')){
        currentTab <- 'HOMEPAGE'
      }
      

      这段代码在我的server底部

      # Current tab
      observe({
        currentTab <<- input$navbar
      })
      

      像魅力一样工作。感谢大家的帮助。

      【讨论】:

      • 请注意,这实际上是记住上次关闭选项卡时选择了哪个选项卡。如果您希望它用于刷新,您可能需要分配另一个全局变量并拥有更多 if/else 分支。
      • 此解决方案还意味着所有用户将共享同一个选项卡。如果我转到您的应用程序并打开特定选项卡,然后您在 2 秒后转到计算机上的应用程序,您将位于我打开的选项卡上。我不知道这是否是您想要的行为,这通常不是您想要的行为。
      • 确实如此。出于我的目的,我的应用程序的所有用户都在他们自己的计算机上工作,这意味着这不是一个问题。但这是一个很好的观点,这通常不是理想的行为,对于其他人来说,这可能还不够好。但是我对 HTML5 或使用 cookie 一无所知,所以这需要暂时起作用。再次感谢。
      猜你喜欢
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 2018-10-30
      相关资源
      最近更新 更多