Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

shiny: passing reactiveValues to conditionalPanel

Can I pass a reactiveValues to a conditionalPanel's condition? If so, how?

Here is what I have tried in the conditionalPanel ui.R:

conditionalPanel(condition = "values.cond == 0", etc.

where I have defined values$cond in server.R:

values <- reactiveValues(cond = 0)

I have also tried alternatives like "values.cond == true", without success.

library("shiny")
runGist("https://gist.github.com/anonymous/8281021")

See the code:

https://gist.github.com/anonymous/8281021

like image 993
PatrickT Avatar asked Jan 06 '14 10:01

PatrickT


2 Answers

As @jdharrison pointed out, you have the problem, that you have reactive values or any other data on the server side and the conditional panel is a JS condition + some HTML on the client side. Hence, if you want to dynamically update the JS condition according to some value you calculated on the server side, you need to get the data from the server to the client. I think what you could do is use an still undocumented feature of shiny to pass custom data from the server to the client. I wrote a blog post on how to do that: http://ryouready.wordpress.com/2013/11/20/sending-data-from-client-to-server-and-back-using-shiny/

I guess you could use that approach to dynamically update the JS panel condition. You would need to write a JS function that does this after the data has been passed. So this boils down to replacing the data-display-if attribute of the conditionalPanel output with the values you want.

Another idea: If your UI strongly depends on calculations on the server side you may want to consider creating the (sidebar) content dynamically using renderUI.

EDIT: Btw, that's what @jdharrison referred to in his second comment.

like image 154
Mark Heckmann Avatar answered Oct 03 '22 09:10

Mark Heckmann


You can also do it by rendering text.

UI:

shinyUI(
  fluidPage(
    # Application title
    titlePanel("Test"),

    sidebarLayout(
      sidebarPanel(
        actionButton("ShowCond", "Show Conditional Panel"),
        conditionalPanel(
          condition = "output.test=='5'",
          actionButton("CheckFile", "Check file")
        )
      ),
      mainPanel(
        verbatimTextOutput("test")
      )
    )
  )
)

Server:

shinyServer(function(input, output, session) {
  var <- eventReactive(input$ShowCond, {
    5
  })

  output$test <- renderText({
    var()
  })
})

The catch is here that it doesn't work without the verbatimTextOutput. You need to include it somewhere on your UI side. However, you could reuse it as a message.

EDIT:

It is also possible without the verbatimtext. By default Shiny suspends all output when they are not displayed. However, this can be changed by setting the following option for a specific output variable:

outputOptions(output, "test", suspendWhenHidden=FALSE)

In this case, there is no more need to use verbatimtext (and the corresponding rendertext).

Source: https://shinydata.wordpress.com/2015/02/02/a-few-things-i-learned-about-shiny-and-reactive-programming/#use-of-isolate-to-prevent-accidental-dependencies

like image 39
takje Avatar answered Oct 03 '22 10:10

takje