Блестящий: передача реактивных значений для условной панели - программирование

Блестящий: передача реактивных значений для условной панели

Могу ли я передать reactiveValues ​​условие conditionalPanel? Если да, то как?

Вот что я пробовал в conditionalPanel ui.R:

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

где я определил values$cond в server.R:

values <- reactiveValues(cond = 0)

Я также пробовал альтернативы, такие как "values.cond == true", без успеха.

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

Смотрите код:

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

4b9b3361

Ответ 1

Как отметил @jdharrison, у вас возникла проблема: у вас есть реактивный values или любые другие данные на стороне сервера, а условная панель - это условие JS + некоторый HTML на стороне клиента. Следовательно, если вы хотите динамически обновлять условие JS в соответствии с некоторым значением, вы рассчитали на стороне сервера, вам нужно получить данные с сервера на клиент. Я думаю, что вы можете сделать, это использовать еще недокументированную функцию блестящего для передачи пользовательских данных с сервера клиенту. Я написал сообщение в блоге о том, как это сделать: http://ryouready.wordpress.com/2013/11/20/sending-data-from-client-to-server-and-back-using-shiny/

Я думаю, вы могли бы использовать этот подход для динамического обновления состояния панели JS. Вам нужно будет написать JS-функцию, которая сделает это после передачи данных. Таким образом, это сводится к замене атрибута data-display-if вывода conditionalPanel на нужные значения.

Еще одна идея. Если ваш пользовательский интерфейс сильно зависит от вычислений на стороне сервера, вы можете захотеть динамически создать создание (боковой панели) контента с помощью renderUI.

EDIT: Кстати, это то, о чем упоминал @jdharrison в своем втором комментарии.

Ответ 2

Вы также можете сделать это, предоставив текст. Пользовательский интерфейс:

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")
      )
    )
  )
)

Сервер:

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

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

Улов здесь, что он не работает без verbatimTextOutput. Вам нужно включить его где-нибудь на стороне вашего интерфейса. Однако вы можете повторно использовать его в качестве сообщения.

EDIT:

Это также возможно без дословного текста. По умолчанию Shiny приостанавливает вывод, если он не отображается. Однако это можно изменить, установив следующий параметр для конкретной выходной переменной:

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

В этом случае нет необходимости использовать verbatimtext (и соответствующий rendertext).

Источник: https://shinydata.wordpress.com/2015/02/02/a-few-things-i-learned-about-shiny-and-reactive-programming/#use-of-isolate-to-prevent-accidental-dependencies