2016-07-27 2 views
1

Моя цель состоит в том, чтобы иметь tabsetPanel, завернутый в conditionalPanel, условие которого является глобальной переменной, являющейся false.Возможно ли иметь Shiny ConditionalPanel, чье условие является глобальной переменной?

ui.R

mainPanel(
conditionalPanel("searchPage == \"false\"", 
    tabsetPanel(
     tabPanel("Summary",htmlOutput("summary")), 
     tabPanel("Description", htmlOutput("description")) 
))), 

global.R

searchPage <- "true" 

затем в server.RI присвоить новые значения к нему несколько раз разные, но все так:

observeEvent(input$openButton, 
      output$results <- renderUI({ 
      textOutput("") 
      searchPage <- "false" 
      })) 

Независимо от того, что я делаю, я всегда получаю сообщение «Uncaught ReferenceError: searchPage не определено». Я попытался изменить global.R на несколько разных комбинаций использования котировок, не используя кавычки, используя < - или < < - что делает его this.searchPage, my.searchPage и многие другие вещи (конечно, всегда делая server.R и ui.R тоже), но им не повезло.

+0

Это классическая утилита для 'shinyjs :: toggle()'. Каждый раз, когда мне нужно условно показывать что-то, где условие не является простым выражением javascript ввода, я использую shinyjs :: show() или hide() или toggle() –

+0

Я использую toggle/hide/show ton в течение всего моего проекта , но я не знаю, что можно назначить целую панель id, так что вы вызываете, чтобы скрыть всю панель? –

+1

Вы можете просто обернуть всю панель в div с идентификатором. Поэтому определите панель, например 'mainPanel (div (id =" mainpanel ", ...))' и voila, есть идентификатор вашей панели –

ответ

1

Как уже отмечался в комментарии к сообщению на вопрос, это является идеальным UseCase для toggle()/show()/hide() функций shinyjs. Всякий раз, когда вам нужно условно показать что-то, где условие не является простым выражением javascript ввода, легко использовать эти функции вместо conditionalPanel().

Для использования этих функций вам необходимо указать способ, которым вы хотите скрыть/показать (в данном случае, mainPanel()). Простой способ сделать это - просто обернуть всю панель в div с id. Поэтому определите панель, например, mainPanel(div(id = "mainpanel", ...)) и voila, там есть идентификатор вашей панели, и теперь вы можете позвонить shinyjs::show("mainpanel") или hide() всякий раз, когда вы хотите в код сервера.

1

То, что вы пытаетесь сделать, на самом деле не так, как вы пытаетесь это сделать (сервер и клиент находятся в разных средах и не обмениваются переменными). Вам нужно будет явно передать значение с сервера на клиент, и для этого есть разные подходы. Один из способов:

library(shiny) 
runApp(list(ui = fluidPage(
    conditionalPanel(condition='output.bool', 
        HTML("Hello world")), 
    actionButton("btn","Press me to toggle") 
), 
server = function(input, output, session) { 
    value=TRUE 
    output$bool <- eventReactive(input$btn,{ 
    value  
    }) 
    outputOptions(output,"bool",suspendWhenHidden=FALSE) 

    observeEvent(input$btn, 
       value <<- !value   
) 

})) 

Есть, вероятно, лучшие подходы. Надеюсь, что это помогает

+0

Спасибо! Ваша демонстрация работает отлично, но по какой-то причине у меня все еще возникают проблемы с ее правильной работой в моем проекте (она всегда показывает панель или никогда не делает). Я буду продолжать пытаться, но не возражаете ли вы объяснять, что такое OutputOptions? Это просто в основном объявление output.bool? –

+0

Параметры вывода в основном говорят серверу о том, что значение bool всегда отображается на стороне клиента. – Carl

+0

О, ладно, спасибо за помощь! Сейчас я полуработал - он работает каждый раз (это одна кнопка для шоу, одна кнопка для скрытия), поэтому я, по крайней мере, добиваюсь прогресса. –

Смежные вопросы