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
按钮。
我在结合 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
按钮。