Фильтрация таблицы данных кнопкой / одним щелчком мыши (R Flexdashboard) - PullRequest
0 голосов
/ 23 октября 2018

Я использую DT :: datatable во Flexdashboard, чтобы предоставлять ежемесячные KPI для примерно 100 разных стран.Пять из них представляют особый интерес для некоторых пользователей панели мониторинга, поэтому я ищу решение, которое бы легко фильтровало эти страны.

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

Вот небольшой пример таблицы, которую я пока получаю:

# Random Data Frame
df <- data.frame(Country = paste("Country", 1:100, sep = "_"), 
                 Revenue = rnorm(n = 100, mean = 5000, sd = 2000))

# Data Table used in Dashboard
datatable(df, class = "hover", rownames = FALSE , extensions = 'Buttons', options = list(
  pageLength = 5,
  responsive = TRUE,
  dom = 'Bftip',
  buttons = c('copy', 'csv'),
  columnDefs = list(list(className = 'dt-center', targets = "_all"))
)) %>% formatCurrency(columns = "Revenue")

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Я бы использовал shinyApp, встроенный в ваш flexdashboard файл.

Примечание в YAML (текст вопроса) вам необходимо установить: runtime: shiny

Ваши ключевые элементыКод:

Выпадающий код выбора в пользовательском интерфейсе

Choices, который вы можете указать в качестве ПЯТИ стран, представляющих интерес для вашей команды.

  # Input: Choose dataset ----
  selectInput("dataset", "Choose a Country",
              choices = as.character(unique(df$Country)))

Кнопка загрузки

На стороне сервера логика применяется только для загрузки отфильтрованных данных.

  # Button
  downloadButton("downloadData", "Download")

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

  # Reactive value for selected dataset ----
  datasetInput <- reactive({
      df %>% filter(Country ==input$dataset)
  })

Наконец, это позволяет вамзагрузить отфильтрованные данные

  # Downloadable csv of selected dataset ----
  output$downloadData <- downloadHandler(
    filename = function() {
      paste(as.character(input$dataset), ".csv", sep = "")
    },
    content = function(file) {
      write.csv(datasetInput(), file, row.names = FALSE)
    }

Полезные ссылки

Пример блестящего приложения

Использование Shiny в Flex Dashboards

FULL * .Rmd Код ниже

---
title: "Filter Data"
output: flexdashboard::flex_dashboard
runtime: shiny
---

```{r global, include=FALSE}
# load data in 'global' chunk so it can be shared by all users of the dashboard
library(shiny)
library(dplyr)
# Random Data Frame
df <- data.frame(Country = paste("Country", 1:100, sep = "_"), 
                 Revenue = rnorm(n = 100, mean = 5000, sd = 2000))
```

To learn more, see [Interactive Documents](http://rmarkdown.rstudio.com/authoring_shiny.html).

## Inputs and Outputs

You can embed Shiny inputs and outputs in your document. Outputs are automatically updated whenever inputs change.  This demonstrates how a standard R plot can be made interactive by wrapping it in the Shiny `renderPlot` function. The `selectInput` and `sliderInput` functions create the input widgets used to drive the plot.

```{r eruptions, echo=FALSE}
ui <- fluidPage(

  # App title ----
  titlePanel("Downloading Data"),

  # Sidebar layout with input and output definitions ----
  sidebarLayout(

    # Sidebar panel for inputs ----
    sidebarPanel(

      # Input: Choose dataset ----
      selectInput("dataset", "Choose a Country",
                  choices = as.character(unique(df$Country))),

      # Button
      downloadButton("downloadData", "Download")

    ),

    # Main panel for displaying outputs ----
    mainPanel(

      tableOutput("table")

    )

  )
)

# Define server logic to display and download selected file ----
server <- function(input, output) {

  # Reactive value for selected dataset ----
  datasetInput <- reactive({
      df %>% filter(Country ==input$dataset)
  })

  # Table of selected dataset ----
  output$table <- renderTable({
    datasetInput()
  })

  # Downloadable csv of selected dataset ----
  output$downloadData <- downloadHandler(
    filename = function() {
      paste(as.character(input$dataset), ".csv", sep = "")
    },
    content = function(file) {
      write.csv(datasetInput(), file, row.names = FALSE)
    }
  )

}
# Create Shiny app ----
shinyApp(ui, server)
```
0 голосов
/ 23 октября 2018

Ниже приведен воспроизводимый пример в Shiny, так как я не думаю, что то, что вы пытаетесь сделать, выполнимо в статическом документе.Я предполагаю, что вы установили runtime: shiny.

library(DT)
library(shiny)

countries <- data.frame(
  cns = LETTERS,
  value = runif(26, 1, 4)
)

TOP5 <- c("A", "B", "X", "Y", "Z")

ui <- fluidPage(
  actionButton("filter", "Filter countries of interest"),
  DTOutput("table")
)

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

  output$table <- renderDT({

    sel <- if(input$filter %% 2 == 0) countries$cns else TOP5

    countries %>% 
      filter(cns %in% sel) %>% 
      datatable()
  })

}

shinyApp(ui, server)
...