Używanie ścieżek względnych w Rmarkdown podczas dziania z dwóch różnych miejsc

Nov 20 2020

Mój problem polega na stosowaniu linków względnych i „kompilowaniu” (robieniu na drutach).

Piszę książkę przy użyciu RMarkdown. Ponieważ plik będzie stosunkowo duży, muszę podzielić na pliki podrzędne i katalogi.

Mam plik wzorcowy, który zawiera tylko linki do rozdziałów (rozdz. 1, rozdz. 2, ...). Dla każdego rozdziału istnieje plik i każdy wymaga odniesienia do niektórych rycin (ryc. 1, ...).

Chciałbym móc niezależnie od siebie łączyć masterfile.Rmd i chap1.Rmd, aby uzyskać jeden plik dla rozdziałów i jeden plik dla całej książki.

Oto jak są zorganizowane moje pliki (MVE). Katalogi są wyświetlane dużymi literami.

  • KORZEŃ
    • masterfile.Rmd
    • RYSUNKI
      • rys1.pdf
      • rys2.pdf
    • ROZDZIAŁY
      • rozdz.1.Rmd
      • rozdz.2.Rmd
      • ...

Kod masterfile.Rmd wygląda następująco:

{r child = '/chapters/chap1.Rmd'}

Kod rozdz.1.Rmd wygląda następująco:

![](../figures/fig1.pdf)

Jak robię na drutach chap1.Rmd, wszystko jest w porządku. Kiedy robię na drutach masterfile, otrzymuję następujący komunikat:

[OSTRZEŻENIE] Nie można pobrać zasobu „../figures/fig1.pdf”: PandocResourceNotFound „../figures/fig1.pdf”

Wydaje się, że fig1.pdfnie można tego znaleźć. Wydaje mi się, że dzieje się tak dlatego, że instrukcja include w pliku głównym tylko „kopiuje” kod chap1.Rmdi „wykonuje” go w ROOTkatalogu (nie w CHAPTERSkatalogu), więc „..” przechodzi do lokalizacji, która nie istnieje (przed ROOT), gdy z dzianiny masterfile.

Mógłbym zmienić ustawienie i zapisać ![](/figures/fig1.pdf)w chap1.Rmdpliku. Będzie działać dobrze, gdy robisz na drutach z, masterfileale już nie chap1.Rmd.

Czy wiesz, jak mieć jedno i drugie?

Odpowiedzi

1 DanielJachetta Nov 20 2020 at 22:37

Witamy w społeczności RMarkdown!

Ze względu na współdziałanie KnitR, Rmd i pandoc nie jest to tak łatwe rozwiązanie, jak mogłoby się wydawać, ale restrukturyzacja katalogu byłaby prawie łatwiejsza.

Nawet jeśli spojrzysz na najnowszą książkę autora Rmarkdown RMarkdown CookbookTUTAJ . Mają wszystkie rozdziały w ROOTkatalogu i tylko podkatalogi dla obrazów (i być może rysunków).

zasoby:

1. Inne podobne pytanie

2. Opcje Github knitr pytanie

3. podobne pytanie od społeczności Rstudio

tarleb Nov 21 2020 at 18:24

Możesz skorzystać z funkcji filtra Lua, aby przepisać ścieżki obrazu podczas łączenia głównego pliku. Na przykład

function Image (img)
  img.src = img.src:gsub('^%.%./', './')
  return img
end

Spowoduje to zastąpienie ścieżki jak ../figures/fig1.pdfz ./figures/fig1.pdf.

Użyj kodu zapisując go do pliku i wywołując dodanie go przez pandoc_args(tylko w głównym pliku).

---
output:
  html_document:
    pandoc_args: ["--lua-filter=filter.lua"]
---