Используйте функции или циклы для создания блестящих элементов пользовательского интерфейса - PullRequest
0 голосов
/ 28 февраля 2020

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

output$loss <- renderUI({
    req(input$got)
    if(input$got %in% Years) return(numericInput('got_snow', label = 'John Snow', value = NA))
    if(!input$got %in% Years) return(fluidRow(column(3)))
})

, а в файле пользовательского интерфейса у меня есть:

splitLayout(
  cellWidths = c("30%","70%"),
  selectInput('got', label = 'Select age', choices = c('',Years) , selected = NULL),
  uiOutput("loss")
)

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

ui_renderer <- function(in_put, label, id){
  renderUI({
    req(input[[in_put]])
    if(input[[in_put]] %in% Years) return(numericInput(id, label = label, value = NA))
    if(!input[[in_put]] %in% Years) return(fluidRow(column(3)))
  })

}
output$p_li <- ui_renderer(input='li', "Enter age", id="c_li")

и в своем файле пользовательского интерфейса, я поставил

uiOutput('c_li')

, но он не работает. Любая помощь с благодарностью.

1 Ответ

1 голос
/ 28 февраля 2020

Мне не удалось протестировать ваш код, так как не было минимального рабочего примера. Я не знаю, является ли это опечаткой в ​​вашем примере, но вы пытаетесь отобразить c_li, но ваш вывод называется p_li. Не уверен, как работает перенос объекта рендеринга в стандартную функцию, но я сделал нечто подобное, используя вместо этого реактивные значения.

Это минимальный пример, использующий некоторые ваши термины. Это не рабочий пример, а набросок идеи для предложенного мной решения.

# Set up the UI ----
ui <- fluidPage(
  uiOutput("loss")
)

# Set up the server side ----
server <- function(input, output, session) {

  # Let us define reactive values for the function inputs
  func <- reactiveValues(
    value <- "got",
    label <- "select age",
    id <- "xyz"
  )

  # Set up an observer for when any of the reactive values change
  observeEvent({
    func$value
    func$label
    func$id
  }, {
    # Render a new UI any time a reactive value changes
    output[["loss"]] <- renderUI(
      if (input[[func$value]] %in% years) {
        numericInput(func$id, label = func$label, value = NA)
      } else {
        fluidRow(
          column(3)
        )
      }
    )
  })
}

# Combine into an app ----
shinyApp(ui = ui, server = server)

Общая идея состоит в том, чтобы определить набор реактивных значений и настроить наблюдателя, который будет отображать пользовательский интерфейс каждый раз, когда изменяется одно или несколько реактивных значений. Вы можете назначить новое значение любому из реактивных значений, используя прямое назначение, например, current$value <- "object_two". Внесение этого изменения приведет к обновлению пользовательского интерфейса с использованием реактивного шаблона Shiny, что означает, что вам нужно изменить только одно значение для обновления пользовательского интерфейса.

...