Как предотвратить перезапись блестящих блоков путем добавления выходов в функции? - PullRequest
0 голосов
/ 11 марта 2019

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

Четыре функции, которые я упростил, и код, который генерирует вывод:

panel1Data <- reactive({
  panelData(1)
})

output$panel1header <- renderUI({
  panelHeader(1)
})

output$panel1definition <- renderUI({
  panelDefinition(1)
})

output$panel1plot <- renderPlot({
  panelPlot(panel1Data(), 1)  
}) 

Моя попытка уменьшить это до одной строки выглядит следующим образом:

panel1Data <- reactive({
    panelData(1)
})

panels <- function(data, header, definition, plot, number){

header <- renderUI({
  panelHeader(number)
})

output$definition <- renderUI({
  panelDefinition(number)
})

output$plot <- renderPlot({
  panelPlot(data, number)  
}) 
}    

panels(panel1Data(), output$panel1header, output$panel1definition, output$panel1plot, 1)

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

1 Ответ

1 голос
/ 12 марта 2019

По сути, вы можете попытаться упаковать все динамически генерируемые компоненты в функцию, а затем вызвать эту функцию в renderUI.Пожалуйста, смотрите ниже пример игрушки:

library(shiny)

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

  panel1Data <- reactive({
    panelData(1)
  })

  createPanel <- function(id) {
    headerID <- paste0("header_", id)
    defID <- paste0("def_", id)
    plotID <- paste0("plot_", id)

    res <- list(
      h1(headerID), br(),
      h3(defID), br(),
      h3(paste0(plotID), " goes here.")
    )
    return(res)  
  }
  output$UI <- renderUI({
    createPanel(input$selection)
  })
}

ui <- basicPage(

  h3("Using renderUI and uiOutput"),
  selectInput("selection", label="", choices=c("a", "b", "c")),
  uiOutput("UI")
)

shinyApp(ui = ui, server = server)

Вот очень хороший пост, показывающий общие трюки Shiny: Создание повторно используемых элементов пользовательского интерфейса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...