shiny 中 hide()、show() 和 reset() 组合的问题

Problem with combination of hide(), show() and reset() in shiny

我在结合 shinyjs 包中的 hide()、show() 和 reset() 函数时遇到了问题。 我有两个 div。一个 div 使用多个用户输入收集数据并以提交按钮结束。按下提交按钮后,应该会出现另一个 div,在 table 中显示收集的数据。在这一秒div中,还有一个按钮应该重置原来的giv并再次显示它以便收集更多数据。

我尝试使用 shinyjs 帮助页面中的一些代码生成一个可重现的示例:

library(shiny)
library(shinyjs)

shinyApp(
 ui = fluidPage(
   useShinyjs(),
   div(
     id = "form",
     textInput("name", "Name", "Dean"),
     radioButtons("gender", "Gender", c("Male", "Female")),
     selectInput("letter", "Favourite letter", LETTERS)
   ),
   div(
     id = "formreset",
     textInput("name", "Newform", "Dean"),
     radioButtons("gender", "Newform", c("Male", "Female")),
     selectInput("letter", "Newform letter", LETTERS)
   ),
   actionButton("reset_originalDiv", "Reset to original div"),
   actionButton("resetName", "Reset name"),
   actionButton("resetGender", "Reset Gender"),
   actionButton("change_div", "Change div")
 ),
 server = function(input, output) {
   observeEvent(input$resetName, {
     reset("name")
   })
   observeEvent(input$resetGender, {
     reset("gender")
   })
   observeEvent(input$change_div, {
     hide("form")
     show("formreset")
   })
   observeEvent(input$reset_originalDiv, {
     reset("form")
     hide("formreset")
     show("form")
   })
 }
)

如您所见,当点击“重置为原始div”时,原来的div不再显示。

我的错误在哪里?

非常感谢您。

预先:也许 show(.) 不是您认为的节目,请使用 shinyjs::show

发现:向调用 show:

observeEvent 块之一添加调试步骤
   observeEvent(input$change_div, {
     browser()
     hide("form")
     show("formreset")
   })

运行 应用程序,然后单击相应的按钮。

如果我们看hide,就是我们认为应该的样子:

Browse[2]> hide
function (id = NULL, anim = FALSE, animType = "slide", time = 0.5, 
    selector = NULL, asis = FALSE) 
{
    ...
}
<bytecode: 0x000000000a6a7538>
<environment: namespace:shinyjs>

然而,也许show不是:

Browse[2]> show
standardGeneric for "show" defined from package "methods"

function (object) 
standardGeneric("show")
<bytecode: 0x000000001b740f30>
<environment: 0x000000001a823fb0>
Methods may be defined for arguments: object
Use  showMethods(show)  for currently available ones.
(This generic function excludes non-simple inheritance; see ?setIs)

这向我们展示了 methods::show,它的第一个参数确实是 character,并且它的 return 值通常对我们来说并不重要,因为 shinyjs::show的 return 值为 NULL,仅在 side-effect 中运行。由于 所做的,我们不会收到任何警告或错误提示可能有问题。

如果您将所有引用更改为 shinyjs::show,也许它会起作用。

注意:我第一次 运行 这个应用程序时,它的行为与我刚刚记录的不正确 show 一样。一旦我测试了修复,现在我无法使用常规 show("formreset") 重现该问题,因此可能发生了其他事情。使用 shinyjs::show 永远不会 错误或不同(除非您真的希望使用不同的 show)。

我不确定该行为的原因,但如果您删除 hide("formreset") 并将 reset("form") 移动到 observeEvent(input$reset_originalDiv... 中的最后一次调用,您就会得到该行为你在找

observeEvent(input$reset_originalDiv, {
      shinyjs::show("form")
      reset("form")
      # hide("formreset")
    })

您可能希望根据 div class 形式的样式条件在 observe({}) 块中使用 toggle,隐藏时为“显示:none" 来管理 formreset 按钮。