Как я могу максимизировать значение числового входа RShiny в зависимости от значения другого входа? - PullRequest
0 голосов
/ 07 октября 2019

У меня есть два числовых входа на панели управления RShiny. По сути, я бы хотел, чтобы значение a никогда не превышало значение b. Таким образом, при указании numericInput из a мне бы очень хотелось что-то подобное для параметра max: max = min(100, input$b).

Возможно ли это сделать на стороне пользовательского интерфейса? Может быть, как-то с ShinyJs? Если нет, может ли кто-нибудь порекомендовать мне обходной путь в функции сервера, если таковой имеется?

Я знаю, что в функции сервера я могу получить доступ к минимуму и максимуму входов в виде input$a[1], но я не вижу, как я могу ограничить пользователя от слишком большого увеличения числового ввода,

library(shiny)

ui <- fluidPage(  
  # value of a should always be smaller than b
  numericInput("a", "a:", 5, min = 1, max = 100, step = 1),
  numericInput("b", "b:", 20, min = 1, max = 100, step = 1)
)

shinyApp(ui, server)

1 Ответ

1 голос
/ 07 октября 2019

Вы можете сделать это uiOutput / renderUI. Вы включаете uiOutput в пользовательский интерфейс и заполняете его renderUI на стороне сервера. Таким образом, у вас есть шанс оценить input$b перед рендерингом input$a. Вы можете включить req на сервере, чтобы убедиться, что input$b имеет значение, прежде чем пытаться отобразить пользовательский интерфейс для input$b. Таким образом, вы можете избежать возможных ошибок, связанных с input$b, не имеющим значения.

РЕДАКТИРОВАТЬ Чтобы «запомнить» значение a до повторного создания числового ввода для a мы можем использовать reactiveVal. Слайдеры показывают это лучше:

library(shiny)

ui <- fluidPage(  
  # value of a should always be smaller than b
  # numericInput("a", "a:", 5, min = 1, max = 100, step = 1),
  uiOutput("aa"),
  sliderInput("b", "b:", 20, min = 1, max = 100, step = 1)
)

server <- function(input, output) {

  what_was_a <- reactiveVal()

  output$aa <- renderUI({
    x <- req(input$b)
    sliderInput("a", "a:", what_was_a(), min = 1, max = x, step = 1)
  })

  observe({
    what_was_a(input$a)
  })
}

runApp(list(ui=ui, server=server))

...