Shiny

时间:2018-08-02 15:38:14

标签: r shiny

目标和当前方法

我有一个模块,可以删除自己的UI。我还希望能够从模块外部调用此终止功能,因此,我向模块的服务器逻辑传递了一个额外的响应,并在此响应被触发时调用终止例程。

到目前为止,一切都很好。现在,我想实现一个函数,该函数首先杀死我的模块的所有实例,然后添加该模块的新实例,这就是我在选择设计时遇到的问题。

问题

我需要的是,在我的input$add5观察者添加任何新实例之前,所有旧实例都将被杀死。这可以通过设置kill_switch(TRUE)来完成,但是问题是在我模块中的observer对此做出反应之前,input$add5观察者会继续添加新模块,从而重置{{ 1}}至kill_switch,基本上旧实例永远不会被杀死。

基本上,在当前设计中,我希望FALSE上的observer在更改标志后立即做出反应,只有这样做之后,我的kill_switch观察者才会继续。

我需要的

我认为我的设计不是最佳的,因此,关于如何在主应用程序和模块之间建立接口的任何建议将受到高度赞赏。


代码

add5

1 个答案:

答案 0 :(得分:0)

我想到的一种解决方案是按以下方式拆分remove / add

server <- function(input, output, session) {
  ids <- reactiveVal(0)
  kill_switch <- reactiveVal(FALSE)
  add5 <- reactiveVal(FALSE)

  handler <- reactiveValues()

  add_new <- function() {
    kill_switch(FALSE)
    ids(ids() + 1)
    new_id <- paste0("id", ids())
    insertUI("#content", "beforeEnd", boxer_ui(new_id))
    handler[[new_id]] <- callModule(boxer, new_id, kill_switch)
  }

  observeEvent(input$new, {
    isolate({
      add_new()
    })})

  observeEvent(input$add5, {
    isolate({
      kill_switch(TRUE)
      add5(TRUE)
    })})

  observe({
      req(add5())
      isolate({
         replicate(5, add_new())
         add5(FALSE)
      })
  })

  observeEvent(input$killall, kill_switch(TRUE))
}

然而,这是基于这样的假设:observer永远不会被任何其他observer中断。真的吗?在这种情况下,我还可以添加priority参数以确保首先触发内部observer

有人能证明我的假设是正确的吗?