メモ:Shinyで条件に応じてactionButtonのactionを変える

conflrで、「すでに同名のページがあったときだけ、上書きしていいかを確認するダイアログを出す」ということをしたかった。 軽く調べた感じ、actionButton()inputIdを動的に与えるのが簡単そうだった。

以下の例だと、confirmok という2つのイベントがあって、

  • ok だとそのまま stopApp() する
  • confirm だと showModal() でダイアログを出して、そこに okactionButton() が置かれている(ので結局 ok に行き着く)

という流れになっている。もっと簡単な方法ある気もしつつ、 inputId が文字列なのでいろいろ応用がありそう、と思ってとりあえずメモ。

library(shiny)

dummy_app <- function(confirm = FALSE) {
  shinyApp(
    ui = basicPage(
      actionButton(if (confirm) "confirm" else "ok", "OK")
    ),
    server = function(input, output) {
      # confirm
      observeEvent(input$confirm, {
        showModal(modalDialog(
          "Are you really sure???",
          footer = tagList(
            modalButton("Hmm, maybe I drank too much yesterday"),
            actionButton("ok", "Yeeessss!!!!")
          )
        ))
      })
      
      # ok
      observeEvent(input$ok, {
        removeModal()
        Sys.sleep(0.2)
        stopApp()
      })
    }
  )
}

# 確認なし
dummy_app()

# 確認あり
dummy_app(TRUE)

確認がこんな感じで出ます。

f:id:yutannihilation:20200202124444p:plain