RMarkdown — наличие условного заголовка (текстового заголовка перед таблицей)

#html #r #r-markdown #kable

#HTML #r #r-markdown #kable

Вопрос:

У меня есть R Markdown, который параметризован. По сути, я фильтрую фрейм данных по полю «case_id» и вывожу таблицу этих отфильтрованных результатов. Я визуализирую документ RMarkdown в цикле, который циклически перебирает каждый уникальный case_id. Для каждого case_id в массиве я проверяю фрейм данных, и если он существует, я вывожу отфильтрованную таблицу, показывающую результаты для этого case_id. Рабочий пример здесь:

RMarkdown ( Разметка ):

 ---
title: "My Title"
output: 
  html_document:
params:
   case: case

---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```


## My Table

```{r warning = FALSE, echo = FALSE, fig.height=10, fig.width=6}
data <- read.csv(text="case_id,event,group,start,end,color,line.color
                       3,event_1,Project,2020-06-15,2020-10-15,#ffffff,#FF0000
                       3,event_1,Meetings,2020-07-30,2020-07-30,#ffffff,#0000ff
                       5,event_1,Meetings,2020-08-30,2020-08-30,#ffffff,#FF0000
                       5,event_1,Meetings,2020-08-30,2020-08-30,#ffffff,#FF0000
                       5,event_1,Meetings,2020-08-30,2020-08-30,#ffffff,#FF0000
                       9,event_1,Meetings,2017-01-15,2017-01-15,#ffffff,#FF0000")
data$case_id <- as.numeric(data$case_id)
if(any(params$case==data$case_id)) {
    
   #Filter PDMP by the selected case
    data.filtered <- data %>%
                        filter(params$case==case_id)
    
    data.filtered <- data.filtered %>%
      filter(!is.na(start)amp;!is.na(end))
    
    pdmp_numRows <- nrow(data.filtered)

    if (pdmp_numRows>0) { 

    #Print table of prescriptions
    data.filtered %>%
      arrange(start)%>%
      kable() %>%  kable_styling(bootstrap_options = "striped","condensed", font_size = 12)
      
    }
    
 }


```
 

И вот R-скрипт, который его отображает:

 library(dplyr)
library(knitr)
library(rmarkdown)


#--------------------- Render RMarkdown Document ---------------------
case_array <- c(1:10)

render_data <- function(case) {
  # assuming the output format of input.Rmd is PDF
  rmarkdown::render(
    "C:/Temp/test_kable.Rmd",
    output_file = paste0('//my_directory/', 'test_cable_ex_',case, '.html'),
    params = list(case=case),
    envir = parent.frame()
  )
}

for (case in case_array) {
  render_data(case)
}
 

Таблицы выводятся, как и ожидалось. Проблема в том, что когда таблица не создается (когда строки отфильтрованного фрейма данных = 0), я не хочу, чтобы отображался заголовок таблицы «Моя таблица». Я хочу, чтобы «Моя таблица» отображалась только тогда, когда таблица существует.

Это то, что я хочу:

введите описание изображения здесь

Это то, чего я не хочу:

введите описание изображения здесь

Ответ №1:

Вы можете сделать это, заключив заголовок таблицы в соответствующие операторы if .

    ---
    title: "My Title"
    output: 
      html_document:
    params:
       case: case
    ---

    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = TRUE)
    ```

    ```{r warning = FALSE, echo = FALSE, fig.height=10, fig.width=6}
    data <- read.csv(text="case_id,event,group,start,end,color,line.color
                           3,event_1,Project,2020-06-15,2020-10-15,#ffffff,#FF0000
                           3,event_1,Meetings,2020-07-30,2020-07-30,#ffffff,#0000ff
                           5,event_1,Meetings,2020-08-30,2020-08-30,#ffffff,#FF0000
                           5,event_1,Meetings,2020-08-30,2020-08-30,#ffffff,#FF0000
                           5,event_1,Meetings,2020-08-30,2020-08-30,#ffffff,#FF0000
                           9,event_1,Meetings,2017-01-15,2017-01-15,#ffffff,#FF0000")
    data$case_id <- as.numeric(data$case_id)
    param_check <- any(params$case==data$case_id)
    if (param_check) {
        
       #Filter PDMP by the selected case
        data.filtered <- data %>%
                            filter(params$case==case_id)
        
        data.filtered <- data.filtered %>%
          filter(!is.na(start)amp;!is.na(end))
        
        pdmp_numRows <- nrow(data.filtered)
        
    }
    ```

    `r  if (param_check) { if (pdmp_numRows > 0) {"# My Table"} }`

    ```{r warning = FALSE, echo = FALSE, fig.height=10, fig.width=6}
    if(param_check) {    
      if (pdmp_numRows>0) { 
    
        #Print table of prescriptions
            data.filtered %>%
          arrange(start)%>%
          kable() %>%  kable_styling(bootstrap_options = "striped","condensed", font_size = 12)
        
      }
      
    }
    
    
    ```
 

Комментарии:

1. Спасибо, но это все еще не работает — вы пытались отобразить rmarkdown с помощью предоставленного мной R-скрипта? Ваш код выводит: — заголовок: «Мой заголовок» вывод: html_document: параметры: case: case —

2. О, подождите, возможно, это сработало — дайте мне посмотреть здесь.

Ответ №2:

Сначала загрузите csv-файл в data.frame, затем поместите заголовок в фрагмент, который будет оцениваться только при наличии обращений с указанным идентификатором:

 ---
title: "My Title"
output: 
  html_document:
params:
   case: case

---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
data <- read.csv(text="case_id,event,group,start,end,color,line.color
                       3,event_1,Project,2020-06-15,2020-10-15,#ffffff,#FF0000
                       3,event_1,Meetings,2020-07-30,2020-07-30,#ffffff,#0000ff
                       5,event_1,Meetings,2020-08-30,2020-08-30,#ffffff,#FF0000
                       5,event_1,Meetings,2020-08-30,2020-08-30,#ffffff,#FF0000
                       5,event_1,Meetings,2020-08-30,2020-08-30,#ffffff,#FF0000
                       9,event_1,Meetings,2017-01-15,2017-01-15,#ffffff,#FF0000")
data$case_id <- as.numeric(data$case_id)
```

```{r, eval=any(params$case==data$case_id), results='asis'}
print("## My Table")
```