【问题标题】:Subset dataset based on crosstalk value in a shiny app基于闪亮应用程序中串扰值的子集数据集
【发布时间】:2021-03-08 22:01:42
【问题描述】:

我使用串扰是为了能够单击条形图中的条形图并根据Abcd 对下表进行子集化。出于某种原因,如果我按下一个条形图,我只会得到数据集的一行,而我应该得到所有数据集。如果我再次选择所有条形,表格仍然只显示一行。

---
title: "Operaitonal dashboard"
author: "Report"
date: 'Date: `r Sys.Date()`'
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    theme: lumen
    vertical_layout: scroll
---

```{r setup, include=FALSE}


knitr::opts_chunk$set(echo=FALSE,
                      warning= FALSE,
                      message = FALSE)
library(crosstalk)
library(shiny)
library(plotly)
library(flexdashboard)
library(ggplot2)
library(dplyr)
library(reactable)
##The four dataframes

Abcd<-c("A","A","B","B")
Prod<-c(34,56,56,89)
Div<-c("Ent","Ent","App","High")
dcross1<-data.frame(Abcd,Prod,Div)


Counts<-c(45,67,78,56)
dcross2<-data.frame(Div,Abcd,Counts)


shared_df <- SharedData$new(dcross1, key = ~Abcd, group = "group")
shared_df2 <- SharedData$new(dcross2, key = ~Abcd, group = "group")


```

# Out of stock Report {data-icon="fa-cart-arrow-down" data-orientation=rows}

## Row {data-height="200"}

### Out Of Stock: Store Overview {data-width="200"}

```{r Oos Store}
daily_store_oos_gg<-
  ggplot(shared_df,
         aes(x=Abcd,
             y=Prod,
             fill=as.factor(Abcd)
             )) +
  geom_bar(stat="identity", position="dodge") 

# Convert to plotly object
daily_store_oos_ply <- 
  ggplotly(daily_store_oos_gg)

daily_store_oos_ply
```

## Column {data-width=405}


### Store Overview Out of Stock
```{r out of stock reactable}
daily_item_oos_rctble<-reactable(
    shared_df2
    )

daily_item_oos_rctble

```

【问题讨论】:

  • 也许您应该检查合并是否符合您的预期。供应商数据框中一共没有Counts=34的记录3,有6条记录。
  • 我的合并目标是简单地合并基于 Abcd 的所有内容,这是所有数据帧的公共变量。为什么这不起作用?
  • 我用非合并的dfs更新了,还是不行
  • crosstalk 和函数 reactable 似乎不兼容。用DT::datatable 替换reactable 对我有用。查看rstudio.github.io/crosstalk/widgets.html 以获取与crosstalk 兼容的软件包
  • 这是非常有用的信息

标签: r shiny crosstalk


【解决方案1】:

正如某人所建议的,reactable 不适用于 crosstalk。也许您的数据可以按如下方式准备。

试试这个

Abcd<-c("A","A","B","B")
Prod<-c(34,56,56,89)
Div<-c("Ent","Ent","App","High")
dcross1<-data.frame(Abcd,Prod,Div)

Countd<-c(45,67,78,56)
dcross2<-data.frame(Div,Abcd,Countd)

Store<-c(199,199)
Abcd<-c("A","B")
Oos<-c(500,400)
store<-data.frame(Store,Abcd,Oos, flag=1)

Man<-c("Corp","Adv","Corp","Adv")
Abcd<-c("A","B","A","B")
Counts<-c(45,56,34,78)
Scounts<-c(23,45,67,67)
Per<-c(1,2,3,5)
supplier<-data.frame(Abcd,Man,Counts,Scounts,Per) # %>% SharedData$new() 
supplier2 <- supplier[order(supplier$Abcd),]

dcross <- cbind(dcross1[,2:3], dcross2[,2:3], supplier2[,2:5]) %>% mutate(id = row_number())

dcross_sub <- group_by(dcross, Abcd) %>% slice(1) %>% select(Abcd, id)
store_sub <- merge(x = dcross_sub, y = store, by = "Abcd", all = TRUE)

dcrossf <- merge(x = dcross, y = store_sub[,2:5], by = "id", all = TRUE)

ui <- fluidPage(
  bscols(widths = 6,
         list(
           plotlyOutput("storep"),
           DTOutput("dcross1t")
         )
  )
)

server <- function(input, output) {
  row.names(dcrossf) <- NULL
  
  dcross11 <- SharedData$new(dcrossf, key = ~Abcd, group = "group")
  store2 <- SharedData$new(subset(dcrossf, flag==1), key = ~Abcd, group = "group")

  daily_store_oos_gg<-
    ggplot(store2,
           aes(x=Abcd,
               y=Oos,
               fill=as.factor(Abcd)
           )) + labs(fill="Abcd") +
    geom_bar(stat="identity", position="dodge")

  # Convert to plotly object
  daily_store_oos_ply <-
    ggplotly(daily_store_oos_gg)

  output$storep <- renderPlotly({daily_store_oos_gg })

  output$dcross1t <- renderDT({dcross11}, server=FALSE)

}

shinyApp(ui, server)

【讨论】:

猜你喜欢
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2015-08-07
  • 2021-07-08
相关资源
最近更新 更多