包装中在描述中crosstalk
提到它用于刷机和过滤。但是,有summary widget
,它允许计算单个汇总统计量。
既然我能够根据过滤后的数据计算单个汇总统计,为什么不根据这个汇总展开并生成一个汇总统计和可视化表格呢?
到目前为止,我已经设法在我的 html 输出中生成了一个表格,其中summarywidget
s 在表格的多个单元格中。还有一个复制按钮,允许查看者从表中选择和复制数据,仅此而已。
到目前为止我的方法:
1.使用 group_by() 为所有组合设置数据和总计,并使用 创建 shareddata 元素crosstalk
。
---
title: "Stack Question"
output: html_document
---
knitr::opts_chunk$set(echo = FALSE)
library(stringr)
#library(instR)
library(dplyr)
library(plotly)
library(DT)
library(kableExtra)
library(tidyr)
library(crosstalk)
ourdata<-data.frame(Rock=c(2,2,2,2,3,3,3,3),
Paper=c(1,2,3,4,5,6,7,8),
Team=c("Green","Blue","Green","Blue","Green","Blue","Green","Blue"),
Skill=c("High", "High","High","High","Low","Low","Low","Low"),
Position=c("Forward","Forward","Center","Center","Forward","Forward","Center","Center"))
##tables of all combinations and the associated totals
ourdata2<-ourdata%>%
group_by(Team,Skill,Position)%>%
summarize(Rock_Total=sum(Rock),
Paper_Total=sum(Paper))
##creating crosstalk shareddata element
shared_ours<-SharedData$new(ourdata2)
2.为每个分类变量构造过滤器
## filters
bscols(widths=c(6,NA,NA),
list(filter_select('Team','Team',shared_ours,~Team,multiple=FALSE)),
list(filter_select('Skill','Skill',shared_ours,~Skill,multiple=FALSE)),
list(filter_select('Position','Position',shared_ours,~Position,multiple=FALSE))
)
3.使用手工编写的html代码生成一个id为“example”的表格元素,在每个单元格中填充一个summarywidget
.
<table id="example" class="cell-border" style="width:100%">
<tr>
<th>Rock Total</th>
<th>Paper Total</th>
</tr>
<tr>
<td>
```{r, echo=FALSE, collapse=TRUE, warning=FALSE, message=FALSE}
summarywidget::summarywidget(shared_ours,statistic = 'sum',column = 'Rock_Total')
```
</td>
<td>
```{r, echo=FALSE, collapse=TRUE, warning=FALSE, message=FALSE}
summarywidget::summarywidget(shared_ours,statistic = 'sum',column = 'Paper_Total')
```
</td>
</tr>
</table>
4.使用javascript版本的datatable
来显示表格。
```{js}
$(document).ready(function() {
$('#example').DataTable();
```
5. 使用脚本为表格生成一个复制按钮(因为我没有成功为datatable
.
<script type="text/javascript">
function selectElementContents(el) {
let body = document.body, range, sel;
if (document.createRange && window.getSelection) {
range = document.createRange();
sel = window.getSelection();
sel.removeAllRanges();
try {
range.selectNodeContents(el);
sel.addRange(range);
} catch (e) {
range.selectNode(el);
sel.addRange(range);
}
} else if (body.createTextRange) {
range = body.createTextRange();
range.moveToElementText(el);
range.select();
}
document.execCommand("Copy");}
</script>
<button type="button" onclick="selectElementContents( document.getElementById('example')
);">Copy Table</button>
<br>
<br>
就目前而言,我并不完全是我想去的地方。是的,有一个可复制的表,其中包含由crosstalk
过滤产生的汇总统计信息,但该表缺乏样式,并且笨重且手动生成。到目前为止,我不知道如何获得plotly
响应此汇总表中结果的(或类似的)视觉效果。我已经想到了一些可以解决这个问题的方法,希望有人能告诉我它们是否可能以及如何实现它们!
可能的解决方案:
- 我可以制作一个包含的数据框
summarywidgets
吗?这样,我可以在生成表格DT
和图形时参考这个新的数据框plotly
,我会很高兴回到我的默认 r 编码形式。 - 如果没有,我可以通过包含
summarywidgets
手动生成的 html 表(如上)来解决这个问题吗?那么,有没有办法将这个手动创建的 html 表引用为plotly
orDT
的数据参数的数据源?(附带问题:如果这是要走的路,是否有一种较少手动的方法来制作小部件并将其放入 html 表格中?) - 是否有一个使用过滤器的严格客户端摘要的解决方案可以实现这里的最终目标?
预先感谢您的帮助!