【问题标题】:How to remove observeEvent in Shiny?如何删除 Shiny 中的 observeEvent?
【发布时间】:2017-03-30 12:46:17
【问题描述】:

我有一个显示模态的函数,当单击保存按钮时,我有一个输入来更改执行函数的名称,并且我有验证绑定到输入:

editNameDialog <- function(input, value, name, save) {
  showModal(modalDialog(
    textInput("modalNewName", paste("Enter", name, ":"), value),
    title = paste("Edit",  name),
    easyClose = TRUE,
    footer = div(
      modalButton("Cancel"),
      actionButton("modalSaveName", "Save", class = "btn-primary")
    )
  ))
  validName <- function() {
    nchar(input$newName) > 5
  }
  observeEvent(input$modalNewName, {
    if (validName()) {
      shinyjs::enable("modalSaveName")
    } else {
      shinyjs::disable("modalSaveName")
    }
  });

  observeEvent(input$modalSaveName, {
    save(input$modalNewName)
    removeModal()
  }, ignoreInit = TRUE, once = TRUE)
}

我这样调用这个函数(来自 server.R):

editNameDialog(input, "default value", "enter name", function(value) {
   other$name <- value
})

它可以工作,但是当我执行该函数两次时,观察者 input$modalNewName 每次按键都会执行两次。如何在添加新事件之前删除事件?

【问题讨论】:

  • 你能发布一个最小可重现的例子吗?
  • @mlegge 我删除了不需要的函数。
  • 可重现的示例,如整个应用程序运行的最小服务器和 ui 对象
  • @mlegge 用户界面可以是空的,服务器可以有这个功能。
  • 如果您搜索如何删除事件,我们在我们的应用程序中最终覆盖了删除先前事件的 observeEvent 函数,我们从闪亮的源代码中复制了代码并进行了相应的修改。

标签: r shiny


【解决方案1】:

我已通过在 javascript 中添加验证来解决此问题:

function observeModalName() {
  var save = $('#modalSaveName');
  $('#modalNewName').off('keyup').on('keyup', function() {
    var self = $(this);
    if (self.val().length < 5) {
      save.disable();
      self.error({message: 'Name must be at least 5 characters long'});
    } else {
      save.enable();
      self.error('remove');
    }
  });
}

并执行:

shinyjs::runjs("observeModalName()")

【讨论】:

    猜你喜欢
    • 2017-11-06
    • 2022-01-19
    • 2021-09-07
    • 2021-12-21
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多