Блестящий: передача реактивных значений для условной панели
Могу ли я передать 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
Ответы
Ответ 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