我正在Flexdashboard中使用DT :: datatable来提供约100个不同国家的每月KPI。其中有五个仪表板用户特别感兴趣,因此,我正在寻找一种可以轻松筛选这些国家/地区的解决方案。
我的想法是在“导出按钮”旁边生成一个按钮,该按钮将仅过滤这五行上的数据。再次单击它可以最完美地再次显示原始表。 我发现可以指定custom buttons,但仍然不知道如何解决此问题。
这是到目前为止我得到的表的一个小例子:
# 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")
感谢您的帮助!
答案 0 :(得分:0)
以下是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)
答案 1 :(得分:0)
我会使用SELECT SUM(CASE WHEN(date_difference>=3) THEN 1 ELSE 0 END) OVER (PARTITION BY customer_id ORDER BY date)
FROM df
sqlContext.sql(qry).show()
文件中嵌入的shinyApp
。
在您的YAML(首要事项)中,您需要设置:flexdashboard
在用户界面中下拉选择代码
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)
})
有用的链接
Using Shiny in Flex Dashboards
# 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)
}