Меня удивляет, что это еще не упоминалось, поэтому для полноты ...
Вы можете выполнить распаковку списка с помощью оператора «splat»: *
, который также будет скопируйте элементы вашего списка.
old_list = [1, 2, 3]
new_list = [*old_list]
new_list.append(4)
old_list == [1, 2, 3]
new_list == [1, 2, 3, 4]
Очевидным недостатком этого метода является то, что он доступен только в Python 3.5 +.
Сроки, однако, это работает лучше, чем другие распространенные методы.
x = [random.random() for _ in range(1000)]
%timeit a = list(x)
%timeit a = x.copy()
%timeit a = x[:]
%timeit a = [*x]
#: 2.47 µs ± 38.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#: 2.47 µs ± 54.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#: 2.39 µs ± 58.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#: 2.22 µs ± 43.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Я бы рекомендовал, чтобы люди использовали пакет bookdown для создания отчетов из нескольких файлов R Markdown. Он добавляет много полезных функций, таких как перекрестные ссылки, которые очень полезны для более длинных документов.
Адаптация примера из @Eric - вот минимальный пример настройки bookdown. Основная деталь заключается в том, что основной файл должен называться index.Rmd
и должен включать дополнительную строку YAML site: bookdown::bookdown_site
:
index.Rmd
---
title: "A Minimal bookdown document"
site: bookdown::bookdown_site
output:
bookdown::pdf_document2:
toc: yes
---
01-intro .Rmd:
# Chapter 1
This is chapter 1.
```{r}
1
```
02-intro.Rmd:
# Chapter 2
This is chapter 2.
```{r}
2
```
Если мы вставим index.Rmd
bookdown, объедините все файлы в том же каталоге в алфавитном порядке ( это может быть изменено с помощью дополнительного файла _bookdown.yml
).
Как только вам станет удобно с этой базовой настройкой, легко настроить выпадающий документ и выходные форматы с использованием дополнительных файлов конфигурации, т.е. _bookdown.yml
и _output.yml
Дальнейшее чтение
- R Markdown: окончательное руководство : Глава 11 дает большой обзор bookdown
- Авторские книги с книжной книгой содержат исчерпывающее руководство по книге и рекомендуются для более подробной информации.
Это сработало для меня:
Rmd_bind <-
function(dir = ".",
book_header = readLines(textConnection("---\ntitle: 'Title'\n---")))
{
old <- setwd(dir)
if(length(grep("book.Rmd", list.files())) > 0){
warning("book.Rmd already exists")
}
write(book_header, file = "book.Rmd", )
cfiles <- list.files(pattern = "*.Rmd", )
ttext <- NULL
for(i in 1:length(cfiles)){
text <- readLines(cfiles[i])
hspan <- grep("---", text)
text <- text[-c(hspan[1]:hspan[2])]
write(text, sep = "\n", file = "book.Rmd", append = T)
}
render("book.Rmd", output_format = "pdf_document")
setwd(old)
}
Представьте, что есть лучшее решение и было бы неплохо иметь что-то подобное в пакетах rmarkdown или knitr.
Обновление в августе 2018 года: этот ответ был написан до появления bookdown, что является более мощным подходом к написанию книг Rmarkdown. Посмотрите минимальный пример bookdown в ответе @ Mikey-Harper!
Когда я хочу разбить большой отчет на отдельный Rmd, я обычно создаю родительский Rmd и включаю главы как дети. Этот подход легко понять новым пользователям, и если вы включаете оглавление (toc), легко перемещаться между главами.
report.Rmd
---
title: My Report
output:
pdf_document:
toc: yes
---
```{r child = 'chapter1.Rmd'}
```
```{r child = 'chapter2.Rmd'}
```
Глава 1.Rmd
# Chapter 1
This is chapter 1.
```{r}
1
```
chapter2.Rmd
# Chapter 2
This is chapter 2.
```{r}
2
```
Build
rmarkdown::render('report.Rmd')
Что производит: [/g0]
И если вы хотите быстро создать куски для ваших дочерних документов:
rmd <- list.files(pattern = '*.Rmd', recursive = T)
chunks <- paste0("```{r child = '", rmd, "'}\n```\n")
cat(chunks, sep = '\n')
# ```{r child = 'chapter1.Rmd'}
# ```
#
# ```{r child = 'chapter2.Rmd'}
# ```