2016-06-18 2 views
1

У меня есть Блестящая приложение, и я создал следующие conditionalPanel «S:Два conditionalPanel х в Shiny

conditionalPanel(condition="output.levels", 
         numericInput("centerpoints", "Number of center points", value=0, min=0, max=25)), 
    conditionalPanel(condition="!output.levels", 
        numericInput("centerpoints", "Number of center points", value=0, min=0, max=0)) 

Если output.levels ИСТИНЫ Я хочу, чтобы выбрать между 0 и 25 центральными точками. В противном случае количество центральных точек должно быть 0.

Проблема в том, что если условие TRUE, я выбираю более 0 центральных точек, а затем условие становится FALSE, Shiny удерживает выбранные центральные точки вместо 0 .

Есть ли способ исправить это? Спасибо.

ответ

4

Проблема, с которой вы сталкиваетесь, состоит из двух почти идентичных элементов в вашем ui, которые имеют один и тот же идентификатор. Условные панели скрывают только ваши элементы, но они все еще присутствуют в документе. Таким образом, ваш первый numericInput всегда будет зарегистрирован Shiny, а второй не будет связан (т. Е. Не будет отправлять его) на Shiny из-за дубликата id.

Советую вам реализовать ситуацию по-другому. В Shiny есть функции, которые позволяют вам изменить какой-либо существующий элемент ui, когда приложение настроено. Эти функции: updateXxxInput, и вы можете изменить любую переменную в соответствующем элементе ввода. Поскольку ваша единственная цель - изменить значение maxnumericInput, мы можем сделать это легко с сервера, где мы можем observelevels или любую другую переменную. В приведенном ниже коде я использовал простой флажок. Команда для изменения значения max равна updateNumericInput(session, "centerpoints", max = 0). Обратите внимание, что это только изменяет один атрибут вашего ввода. Это огромное преимущество перед повторным отображением элементов пользовательского интерфейса, поскольку вам не нужно отслеживать, что все остальные атрибуты.

Функции updateXxxInput очень полезны, поэтому попробуйте!

library(shiny) 

ui <- shinyUI(
    fluidPage(
    numericInput("centerpoints", "Number of center points", value=0, min=0, max=25), 
    checkboxInput("changeCenterpoints", "Cap maximum at 0") 
) 
) 

server <- function(input, output, session){ 
    observeEvent(input$changeCenterpoints, { 
    if(input$changeCenterpoints){ 
     updateNumericInput(session, "centerpoints", max = 0, value = 0) 
    }else{ 
     updateNumericInput(session, "centerpoints", max = 25) 
    } 
    }) 
} 

shinyApp(ui, server) 
+0

Спасибо! Я попробую с UpdateXxxInput функциями. – Marta

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