我开发了一个 Shiny 的应用程序,其中包含一些部分:A、B、C 和 D。在每个部分中,用户都可以制作一些情节。 Shiny App 有一个额外的部分,允许用户在整个 downloadHandler 函数中以 html 格式下载每个部分中完成的所有绘图。因此,用户点击“下载”按钮,就会生成一个包含用户已完成绘图的 html。
这是通过另一个文件完成的,一个 R markdown 文件,它接收 shiny 应用程序的输入。在 R markdown 中,每个图后面都有一些 block 外的文本。
所以 R markdown 的结构是这样的:
A 部分
(A节剧情,来自一个chunk)
(A段的文字,在 block 外)
B 部分
(B节剧情,来自一个chunk)
(B段的文字,在 block 外)
C 部分
(C段剧情,来自一个chunk)
(C段的文字,在 block 外)
D 部分
(D段剧情,来自一个chunk)
(D段的文字,在 block 外)
但是如果用户对 B 部分不感兴趣怎么办?如果在 Shiny 的应用程序中用户决定不选择任何输入来制作情节怎么办?在这种情况下,当点击 shiny 应用程序中的下载按钮时,会产生错误并且不会产生 HTML 输出。
所以问题来了:有没有办法让用户选择(例如使用 checkboxInput)哪些部分要出现在 HTML 输出中?因此,如果用户选中 A 和 C,生成的 HTML 将是:
A 部分
(A节剧情,来自一个chunk)
(A段的文字,在 block 外)
C 部分
(C段剧情,来自一个chunk)
(C段的文字,在 block 外)
当然,我猜 R markdown 文件中需要一些代码,某种 ifelse 语句来显示或隐藏部分。我知道如何为 block 代码做这件事,使用 R 语言很容易,但是文本呢?标题“第 X 节”和该节的文本怎么样?如何在 checkboxInput 的功能中动态包含或排除?
最佳答案
实现所需结果的一种方法是通过代码块添加文本,例如cat
和 block 选项 results='axis'
。在这种情况下,您可以使用参数化报告,并根据参数动态包含所需的文本:
---
title: "Untitled"
output: html_document
params:
section: !r c("SectionA")
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
```
```{r include="SectionA" %in% params$section, results='asis'}
cat("## Section A",
"Lorem Ipsum",
sep = "\n")
```
```{r include="SectionB" %in% params$section, results='asis'}
cat("## Section B",
"Lorem Ipsum",
sep = "\n")
```
```{r include="SectionC" %in% params$section, results='asis'}
cat("## Section C",
"Lorem Ipsum",
sep = "\n")
```
然后在您 Shiny 的应用程序中渲染 Rmd 文件,如下所示:
rmarkdown::render("test.Rmd", params = list(section = c("SectionA", "SectionC"))
关于r - 根据 Shiny R 的输入显示或隐藏 R Markdown 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68128674/