在降价中将列表对象转换为无序列表

Convert list object to unordered list in markdown

我有一个包含字符向量的列表。我想在 RMarkdown 文档中创建一个无序列表。我试图通过遍历列表并将输出粘贴到降价列表中来完成此操作。在 knitr 中打印结果 'asis'。这是一个玩具示例。

test <- list(x = c('a', 'b', 'c'), y = c('d', 'e'))

我想创建一个这样的无序列表:

- x
    - a
    - b
    - c
- y
    - d
    - e

我尝试使用 for 循环结合 catpaste0 来做到这一点。

cols <- names(test)

for (columns in names(test)) {
  cat(paste0("- ", names(test[columns]), '\n', '    ', 
             "- ", test[[cols[columns]]], '\n')) 
}

输出

- x
    - 
- y
    - 

如果能帮助我获得上面描述的所需无序列表,我将不胜感激。

试试这个:

---
title: "SO Answer"
author: "duckmayr"
date: "September 14, 2018"
output: html_document
---

```{r unordered_list, echo=FALSE, results='asis'}
test <- list(x = c('a', 'b', 'c'), y = c('d', 'e'))

for (name in names(test)) {
    cat("-", name, '\n', paste('   -', test[[name]], '\n'))
}
```

对我来说,这会产生:

您之前尝试的方式有两个问题:

  1. 您应该使用 test[[columns]] 而不是 test[[cols[columns]]] 进行子集化,并且
  2. 即使在您修复该问题后,您仍然可以看到 paste 给您带来了一些问题:
for (columns in names(test)) {
   cat(paste0("- ", names(test[columns]), '\n', '    ', 
              "- ", test[[columns]], '\n')) 
}


- x
    - a
 - x
    - b
 - x
    - c
- y
    - d
 - y
    - e

这是一个不需要循环的解决方案。 List 和yaml 文件非常相似,因此你可以将它转换为yaml(稍微修改一下)和cat.

test <- list(A = c("a", "b", "c"), B = c("d", "e"), C = 1:5)
cat(gsub("^!omap\n|:", "", yaml::as.yaml(test, omap = TRUE)))

解释:

  • 使用 yaml package 中的 as.yaml 函数将列表转换为有序的 yaml。
  • 使用 gsub 删除 omap header。
  • cat 结果。


您也可以将它放在自定义函数中,这样您就不会泛滥代码:

catList <- function(inputList) {
    cat(gsub("^!omap\n|:", "", yaml::as.yaml(inputList, omap = TRUE)))
}
catList(test)