怎样让含有 shiny 元素的 flexdashboard 生成 html 文档?
- 已编辑
yuanfan 是的,shiny 无法像普通静态网页一样独立运行,它一定得有一个 R 进程来支撑(因为后端运算都得在 R 里面进行)。这个 R 进程可以是在服务器上(如果这个例子需要其他人远程访问),也可以在你本地的电脑上。包含 shiny 元素的 R Markdown 文档只能点绿色三角形运行,或者用 rmarkdown::run()
,没有 Knit 图标可以点,也不能用 rmarkdown::render()
。
Cloud2016 我不知道 echarts4r 是否支持 crosstalk,要是不支持的话恐怕 crosstalk 也帮不上忙。至少这个页面上没有列出 echarts4r:https://rstudio.github.io/crosstalk/widgets.html
Cloud2016
你帮忙找的这个链接,我看过了,我自己之前还鼓捣过关于 crosstalk 的笔记呢。
- 已编辑
yuanfan 可能是一种蠢蠢的死法
十分钟写个例子(窃以为这个例子简短高能,值得收受西瓜贿赂,前面的反斜杠解释还不值),只是看一眼总不会死吧:
---
title: "下拉菜单控制直方图的窗宽"
output: html_document
---
提供一个下拉菜单。
```{r, echo=FALSE}
n_breaks = c(5, 10, 15, 20)
shiny::selectInput(
"n_breaks",
label = "频数调整(等宽)",
choices = n_breaks,
selected = 5)
```
预先画出所有的图,放在一个类名为 `hist-all` 的层中。
```{r, class.chunk='hist-all'}
x = faithful$eruptions
for (i in n_breaks) {
hist(x, breaks = seq(min(x), max(x), length.out = i + 1),
main = paste('n = ', i))
}
```
但是先不要显示它们。
```{css}
/* 默认隐藏所有图片 */
.hist-all img { display: none; }
/* 但图上如果加了 show 类就显示 */
.hist-all .show { display: block; }
```
召唤 JS 法力。
```{js}
(d => {
const s = d.getElementById('n_breaks'), // 下拉菜单
imgs = d.querySelectorAll('.hist-all img'); // 图片元素数组
// 按照 s 中被选中菜单项的下标 i 来向第 i 幅图添加类名“show”并移除其它图的类名
function showImg() {
const i = s.selectedIndex;
imgs.forEach((el, k) => {
// k 为图片元素的下标,i 为选中菜单的下标,若二者相等则添加 show 类
el.classList.toggle('show', k == i);
});
}
// 小试牛刀,显示第一幅图
showImg();
// 当下拉菜单的值变动时(触发 onchange 事件),重新显示相应的图片
s.onchange = showImg;
})(document);
```
这是个纯静态 HTML 页面,不需要部署到服务器,用 R Markdown 生成之后就可以脱离 R 运行。JS 代码中我用了相对较新的 =>
语法,它是用来生成匿名函数的,x => {}
等价于 function(x) {}
;同理,(x, y) => {}
等价于 function(x, y) {}
。最外面一层函数是为了避免创建全局对象、污染全局环境,而把所有对象都创建在一个匿名函数之内,最后再执行这个匿名函数(这是 JS 里最常见的伎俩),这伎俩 R 里面一样可以用(如 (function(x) {x + 1})(5)
)。除此之外,别的代码应该是不言自明的。