Как разобрать текстовую таблицу в фрагментах кода rmarkdown - PullRequest
0 голосов
/ 11 июля 2020

Существует файл rmarkdown с таблицей markdown, который будет регулярно обновляться. Содержимое должно быть проанализировано в фрагменте кода, чтобы можно было использовать, например, ggplot. Я не хочу сохранять таблицу в фрагменте кода или в отдельном файле.

Как я могу прочитать таблицу из фрагмента кода?

Вы можете найти его как начальный rmarkdown код с таблицей markdown ниже.

---
title: "Parse tables"
output: html_document
---

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

# Step 1: Create markdown table as text

That table will be manually updated directly in the markdown file.

Table: Project Timeline

| date       | description |
|------------|-------------|
| 2020-05-11 | Milestone 1 |
| 2020-07-11 | Milestone 2 |
| 2020-07-20 | Milestone 3 |


# Step 2: Parse the table above

The table should be maintained as a markdown table. That seems to be more easy than working directly with
`tibble` or `tribble`. How can I read the table from the code chunk? 

```{r}
library(tidyverse)
df <- tibble(date = c("2020-05-11", "2020-07-11", "2020-07-20"), 
             description = c("Milestone 1", "Milestone 2", "Milestone 3"))
df
```

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

1 Ответ

1 голос
/ 12 июля 2020

В фрагменте кода примените readLines к вашему Rmd файлу, чтобы получить строки этого файла в векторе:

allLines <- readLines("yourFile.Rmd")

Выберите строки, которые начинаются и заканчиваются |, и удалите вторую (которая является разделительной линией "|-----|-----|"):

tableLines <- allLines[grep("^\\|.*\\|$", allLines)][-2]

Затем с помощью приведенного ниже кода вы получите таблицу в виде матрицы, первая строка которой содержит имена столбцов:

tableAsMatrix <- t(sapply(strsplit(tableLines, "\\|"), function(pieces){
  stringr::str_trim(pieces[-1])
}))

Наконец, преобразуйте эту матрицу, лишенную ее первой строки, в фрейм данных и используйте ее первую строку для установки имен столбцов:

setNames(as.data.frame(tableAsMatrix[-1,,drop = FALSE]), tableAsMatrix[1,])

Полный код

---
title: "Parse tables"
output: html_document
---

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

# Step 1: Create markdown table as text

That table will be manually updated directly in the markdown file.

Table: Project Timeline

| date       | description |
|------------|-------------|
| 2020-05-11 | Milestone 1 |
| 2020-07-11 | Milestone 2 |
| 2020-07-20 | Milestone 3 |


# Step 2: Parse the table above

The table should be maintained as a markdown table. How can I read the table from the code chunk? 

```{r}
allLines <- readLines("ParseTable.Rmd")

tableLines <- allLines[grep("^\\|.*\\|$", allLines)][-2]

tableAsMatrix <- t(sapply(strsplit(tableLines, "\\|"), function(pieces){
  stringr::str_trim(pieces[-1])
}))

df <- setNames(as.data.frame(tableAsMatrix[-1,,drop = FALSE]), tableAsMatrix[1,])

df
```

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

...