对不起,如果这是一个常见的问题,但它让我疯了。我需要将一个actionButton添加到一个触发文件保存的Shiny UI。实际的文件保存命令取决于tabPanel的哪个选项卡是打开的,我可以通过tabPanel id获取该信息。我遇到的问题是访问actionButton的状态并在之后重置它。
在ui.r中,我有类似的东西:
shinyUI(fluidPage(
titlePanel("myTitle"),
sidebarLayout(
sidebarPanel("",
actionButton("save", "Save File"),
# test to make sure the button is working
verbatimTextOutput("sb") # it increments when clicked
)
)
))
在server.r中,我试图这样做:
shinyServer(function(input, output) {
# test to make sure the button is working
output$sb <- renderPrint({ input$save }) # increments when clicked
# here is the problem code:
if(input$save > 0) { # button was clicked, so...
input$save <- 0 # reset the flag
print("HERE") # and do something else
}
})
当然,我会检查tabPanel的状态而不是打印&#34; HERE&#34;如果我遇到这个问题,这可能会产生另一个问题。如何在server.r代码中访问和更改input $ save的值?没有证据表明if()条件语句中的代码正在执行,所以我假设逻辑测试要么没有执行,要么返回FALSE,即使每次单击按钮时输入$ save的值都会递增。
感谢您的任何建议。可能很明显,到目前为止,我对Shiny很新,并且发现它相当不透明。
最佳, --Mike C。
答案 0 :(得分:4)
如果您的代码需要在输入更改时重新执行,则它不能像您现在拥有if
一样位于服务器功能中。你需要将它放在一个观察区块内:
observe({
if (input$save == 0)
return()
isolate({
# Do your saving in here
})
})
你绝对不需要将输入$ save的值重置为0.我全心全意地认为我特意将该功能从框架中移除。 input$save
的实际值除了值0之外没有意义,这仅仅意味着&#34;按钮从未被点击过&#34 ;;对于其他每一个值,价值本身并不重要,只是它改变了。每次到达# Do your saving in here
行时,都表示用户单击了“保存”按钮。无论是第1次还是第100次点击都不重要;事实是,用户只需点击它就可以保存。
答案 1 :(得分:0)
我猜测代码只会在您启动shinyServer
时运行一次。我认为您需要位于reactive
块内才能运行模型更改。否则,现在的代码块将永远不会被重新评估。