如何在R Shiny server.r中访问和更改输入变量

时间:2014-05-22 20:51:42

标签: r shiny

对不起,如果这是一个常见的问题,但它让我疯了。我需要将一个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。

2 个答案:

答案 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块内才能运行模型更改。否则,现在的代码块将永远不会被重新评估。