R блестящие извлекать таблицы из одной и той же функции вывода и показывать в интерфейсе пользователя рядом - PullRequest
0 голосов
/ 13 февраля 2019

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

Ради предоставления воспроизводимого кода: (моя функция getListOfDataFrames намного тяжелее, чем в этом примере) Я хочу, чтобы df1 и df2 отображались рядом с scrollX = TRUE в опциях

library(shiny)
library(DT)

ui <- fluidPage(
  dataTableOutput("output1")
)

server <- function(input, output){

  getListOfDataFrames <- function(df){
  return(list(df[1:5,], df[6:10,]))   
  }

  output$output1 <- renderDataTable({

    myList <- getListOfDataFrames(mtcars)

    df1 <- as.data.frame(myList[1])
    df2 <- as.data.frame(myList[2])

  })

}

shinyApp(ui, server)

1 Ответ

0 голосов
/ 13 февраля 2019

Существует множество примеров создания динамического контента, как, например, ниже:

library(shiny)
library(DT)

ui <- fluidPage(
  uiOutput("dt")
)

server <- function(input, output){

  getListOfDataFrames <- function(df){
    return(list(df[1:5,], df[6:10,]))   
  }

  myList <- getListOfDataFrames(mtcars)

  output$dt <- renderUI({
    ntables <- seq(myList)

    # we want to create the width depending how many tables we have
    width <- paste0(99/max(ntables),"%;")

    lapply(ntables, function(i) {
      id <- paste0("dt", i)
      div(style=paste0("display:inline-block;width:",width),DT::dataTableOutput(id))
    })
  })

  observe({
    # Dynamically creating 2 tables with separate ids
    lapply(seq(myList), function(i){
      id <- paste0("dt", i)
      output[[id]] <- DT::renderDataTable(as.data.frame(myList[i]))
    })
  })

}

shinyApp(ui, server)

enter image description here

...