Преобразовать объект списка в неупорядоченный список в уценке - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть список, содержащий символьные векторы. Я хотел бы создать неупорядоченный список в документе RMarkdown. Я попытался сделать это, просматривая список и вставляя вывод в список уценки. В knitr напечатайте результаты 'asis'. Вот игрушечный пример.

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

Я хотел бы создать неупорядоченный список, подобный этому:

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

Я попытался сделать это, используя цикл for в сочетании с cat и paste0.

cols <- names(test)

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

Какие выходы "

- x
    - 
- y
    - 

Буду признателен за помощь в получении желаемого неупорядоченного списка, который я описал выше.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вот решение, где вам не нужны петли.Список очень похож на документ 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 с использованием функции as.yaml из yaml package .
  • Удалить заголовок omap с помощью gsub.
  • cat результат.

enter image description here


Вы также можете добавить его в пользовательскую функцию, чтобыКод затопления:

catList <- function(inputList) {
    cat(gsub("^!omap\n|:", "", yaml::as.yaml(inputList, omap = TRUE)))
}
catList(test)
0 голосов
/ 14 сентября 2018

Попробуйте это:

---
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'))
}
```

Для меня это дает:

enter image description here

То, как вы пытались это сделать раньше, имело две проблемы:

  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
...