2016-09-07 1 views
-1

Я хочу, чтобы приложение загружало одноразовые значения по умолчанию, но становилось реактивным только тогда, когда пользователь вводит правильный пароль. Для того, чтобы не усложнять работу ДАВАЙТЕ из шаблона Rstudio (поминутно отредактированный):R Shiny: как сделать входное значение условно реактивным (на другом входе)?

ui.R:

library(shiny) 

shinyUI(fluidPage( 
    sidebarLayout(
     sidebarPanel(    
      passwordInput("pw", "Password:"), 

      sliderInput("nbins", 
         "Number of bins:", 
         min = 1, 
         max = 50, 
         value = 30) 
    ),  
    mainPanel(
    plotOutput("histo") 
    ) 
))) 

server.R:

PASSWORD <- "test" 

library(shiny) 

shinyServer(function(input, output) { 

    output$histo <- renderPlot({ 
     x <- faithful[, 2] 
     bins <- seq(min(x), max(x), length.out = input$nbins + 1) 
     hist(x, breaks = bins, col = 'darkgray', border = 'white') 
    }) 
}) 

Есть два реактивных входа pw и nbins. Мой вопрос: как можно расширить код, чтобы сделать nbins (поведенческий) переключатель между реактивным и нереактивным в зависимости от ввода pw, равным PASSWORD?

+0

Является 'conditionalPanel()', что вы ищете? –

+0

@VanceLopez Спасибо, но нет, я смотрю, как это сделать на стороне сервера. Если это вообще возможно. Как бы вы исправить это с помощью 'conditionalPanel()'? – Jim

+0

Я думаю, я не уверен, что вы подразумеваете под «переключением между реактивными и нереактивными». Вы хотите запретить пользователю взаимодействовать с 'nbins', если у них нет правильного пароля, но все же хотите отобразить' output $ histo' на основе исходных значений ввода? –

ответ

1

Что об этом решении:

PASSWORD <- "test" 

    library(shiny) 

    shinyServer(function(input, output) { 
      bins <- eventReactive(input$nbins, { 
        if (input$pw == "PASSWORD") { 
        bins <- seq(min(faithful[, 2]), max(faithful[, 2]), length.out = input$nbins + 1) 
        } else { 
        bins <- seq(min(faithful[, 2]), max(faithful[, 2]), length.out = 30 + 1)  
        } 
      }) 

      output$histo <- renderPlot({ 
        x <- faithful[, 2] 
        #bins <- seq(min(x), max(x), length.out = input$nbins + 1) 
        hist(x, breaks = bins(), col = 'darkgray', border = 'white') 
      }) 
    }) 
+0

Работает после удаления котировок вокруг 'PASSWORD'. благодаря – Jim

0

Опираясь на ответ Valter, вы можете использовать shinyjs включить/отключить интерактивность с входным виджете.

ui.R

library(shiny) 
library(shinyjs) # install shinyjs 

shinyUI(fluidPage( 
    useShinyjs(), # activate 
    sidebarLayout(
    sidebarPanel(    
     passwordInput("pw", "Password:"), 

     sliderInput("nbins", 
        "Number of bins:", 
        min = 1, 
        max = 50, 
        value = 30) 
    ),  
    mainPanel(
     plotOutput("histo") 
    ) 
))) 

server.R

library(shiny) 
library(shinyjs) 

shinyServer(function(input, output) { 

    observe({ 
    if(input$pw != "PASSWORD") shinyjs::hide("nbins") else shinyjs::show("nbins") 
    }) 

    output$histo <- renderPlot({ 
    x <- faithful[, 2] 

    # will 'reset' bins to original value if incorrect pw 
    if(input$pw != "PASSWORD") { 
     bins <- seq(min(x), max(x), length.out = 30 + 1) 
    } else { 
     bins <- seq(min(x), max(x), length.out = input$nbins + 1) 
    } 

    hist(x, breaks = bins, col = 'darkgray', border = 'white') 
    }) 
}) 

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

  • Нет связанных вопросов^_^