根据Shiny R输入显示或隐藏R Markdown文本

3
我已经开发了一个Shiny App,其中包含A、B、C和D四个部分。用户可以在每个部分制作一些图形。 Shiny App的额外部分允许用户通过downloadHandler函数下载所有以html格式完成的图形。 因此,用户单击“下载”按钮后会生成一个带有用户制作的所有绘图的html。
这是通过另一个文件实现的,即R markdown文件,该文件接收Shiny App的输入。在R markdown中,每个图形都在块之外跟随一些文本。
因此,R markdown具有以下结构:

第 A 部分

(来自块的第A部分绘图)
(第A部分的文本在块之外)

第 B 部分

(来自块的第B部分绘图)
(第B部分的文本在块之外)

第 C 部分

(来自块的第C部分绘图)
(第C部分的文本在块之外)

第 D 部分

(来自块的第D部分绘图)
(第D部分的文本在块之外)

但是,如果用户对B部分不感兴趣怎么办? 如果在Shiny App中,用户决定不选择任何输入进行绘图,会产生错误,不会生成HTML输出。
所以这里的问题是:是否有一种方法允许用户选择(例如使用checkboxInput)哪些部分要包含在HTML输出中? 因此,如果用户选择A和C,则生成的HTML将是:

第 A 部分

(来自块的第A部分绘图)
(第A部分的文本在块之外)

第 C 部分

(来自块的第C部分绘图)
(第C部分的文本在块之外)

当然,我想R markdown文件内部需要一些代码,一些ifelse语句来显示或隐藏部分。 对于块代码,我知道如何做到这一点,遵循R语言很容易,但文本呢? 标题“第 X 部分”和该部分的文本如何根据checkboxInput动态包括或排除?
1个回答

2

实现您所需的结果的一种方法是通过代码块添加文本,例如使用cat和代码块选项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"))

enter image description here


1
谢谢!如果我在YAML中直接输入TRUE或FALSE,那么它可以工作。但是我正在尝试做这样的事情:
title: "Untitled" output: html_document params: sectionA: `r "Section A" %in% input$download_sections`
其中'download_sections'是一个checkboxGroupInput,
"Section A" %in% input$download_sections返回TRUE或FALSE,但在YAML中无法识别。
- Miquel
嗯,你如何在shiny内部呈现你的RMD?据我所知,从rmd内部无法访问shiny的“input”列表。但是,如果你使用例如rmarkdown::render,那么你可以通过“params”参数传递参数值。请参阅?rmarkdown::render - stefan
我使用rmarkdown::render(input = "paper.Rmd"),所以如果我修改为rmarkdown::render(input = "paper.Rmd", params = sectionA),它会起作用吗? - Miquel
1
嗨,Miquel。我刚刚进行了编辑并更改了设置,向您展示了一种从shiny内部呈现Rmd的方法。在编辑后的版本中,我仅使用了一个参数,即包含要包括的部分的向量。 - stefan
1
谢谢!你给了我一个想法,尝试在代码块部分中只放置:include = "Section A" %in% input$download_sections , results = 'asis'这样做而不添加渲染参数,也不修改YAML中的任何内容,就可以完美地工作,因此在代码块的规范中,R代码被正确读取。谢谢! - Miquel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接