Переключение между plotOutput и plotlyOutput на основе флажка

Я пытаюсь создать приложение Shiny, которое загружает только plotly, если пользователь устанавливает флажок для интерактивных фигур. Однако то, что я пробовал до сих пор, заканчивалось построением обеих фигур независимо от значения флажка:

require('plotly')
require('shiny')

ui <- fluidPage(

  tabsetPanel(
    id = 'mainTab',

    tabPanel(
      'conditionally interactive tab',

      checkboxInput(
        inputId = 'interactive', label = 'Interactive figure', value = FALSE
      ),

      conditionalPanel(
        condition = 'input.interactive == TRUE',
        plotlyOutput('interactivePlot')
      ),

      conditionalPanel(
        condition = 'input.interactive == FALSE',
        plotOutput('staticPlot')
      )
    ),
    tabPanel('unrelated tab')
  )
)

server <- function(input, output, session){

  output$interactivePlot <- renderPlotly({
    plot_ly(iris, x = ~Petal.Length, y = ~Sepal.Length)
  })

  output$staticPlot <- renderPlot({
    plot(Sepal.Length ~ Petal.Length, iris)
  })
}

shinyApp(ui = ui, server = server)

Причинами этого являются более длительное время загрузки при использовании plotly и неудобство plotly на портативных устройствах (пытаться прокручивать график, реагирующий на прикосновения, сложно). Я бы предпочел не иметь для них отдельных вкладок, но я понимаю, что если ничего не работает, это может быть вариантом.


person Frans Rodenburg    schedule 01.03.2019    source источник


Ответы (1)


Вы очень близко. Выражение внутри условной панели condition является выражением JavaScript, а не выражением R. В JavaScript они используют true/false, а не TRUE/FALSE. Так что просто измените это, и это сработает.

require('plotly')
require('shiny')

ui <- fluidPage(

        tabsetPanel(
                id = 'mainTab',

                tabPanel(
                        'conditionally interactive tab',

                        checkboxInput(
                                inputId = 'interactive', label = 'Interactive figure', value = FALSE
                        ),

                        conditionalPanel(
                                condition = 'input.interactive == true',
                                plotlyOutput('interactivePlot')
                        ),

                        conditionalPanel(
                                condition = 'input.interactive == false',
                                plotOutput('staticPlot')
                        )
                ),
                tabPanel('unrelated tab')
        )
)

server <- function(input, output, session){

        output$interactivePlot <- renderPlotly({
                plot_ly(iris, x = ~Petal.Length, y = ~Sepal.Length)
        })

        output$staticPlot <- renderPlot({
                plot(Sepal.Length ~ Petal.Length, iris)
        })
}

shinyApp(ui = ui, server = server)
person DeanAttali    schedule 01.03.2019
comment
Если бы я использовал список опций с checkboxGroupInput(), как я мог бы перевести что-то в строке 'option1' %in% input$options в JavaScript? - person Frans Rodenburg; 01.03.2019
comment
В духе научить человека ловить рыбу .... :) Google для чего-то вроде строк javascript содержит ли массив строку - person DeanAttali; 01.03.2019
comment
Еще раз спасибо, не повезло с набором членства в Google! (исправлено с помощью options.indexOf("option1") > -1) - person Frans Rodenburg; 01.03.2019