2013-09-29 11 views
10

Korzystanie RStudio -> CompilePDFJak uzyskać listę pakietów używanych w dokumencie knitr .Rnw?

W dokumencie .Rnw być przetwarzane z pdfLaTeX, chciałbym, aby uzyskać listę wszystkich użytkownika (ME) pakietów ładowanych poprzez biblioteki() lub require() w dokument. Próbowałem używać sessionInfo(), tak jak w

\AtEndDocument{ 
    \medskip 
    \textbf{Packages used}: \Sexpr{names(sessionInfo()$loadedOnly)}. 
    } 

Jednak to, co wypisuje tylko lista pakietów używanych przez samą knitr, używane

Pakiety: strawienia, oceniać formatR, highr , stringr, narzędzia.

nie te, do których wyraźnie się odwołałem. Wierzę, że dzieje się tak, ponieważ knitr uruchamia fragmenty kodu w środowisku wewnętrznym, ale nie wiem, jak uzyskać do niego dostęp.

Wiem o pakietach pamięci podręcznej/__, które są tworzone z pamięcią podręczną = TRUE; czy jest jakiś sposób wygenerowania tego automatycznie bez buforowania?

Odpowiedz

0

Tak, czego chcesz, to wszystkie pakiety, które są ładowane z wyjątkiem pakietów podstawowych i dzianin. Gdybym wtedy lista wszystkich pakietów i wykluczyć te, dostaniesz co chcesz:

p <- setdiff(.packages(), 
     c("knitr", "stats", "graphics", "grDevices", "utils", "datasets", 
      "methods", "base")) 
p 

Musisz zrobić pewne wyjątki powiedzieć, jeśli robisz dokument knitr o tworzenie rzeczy w knitr czy chcesz jawnie załadować pakiety podstawowe.

9

Bez pamięci podręcznej (cache = FALSE), co chcesz, jest w zasadzie

unique(c(.packages(), loadedNamespaces())) 

Z cache włączony, to jest nieco bardziej skomplikowana, ponieważ nazwy pakietów są buforowane, a także; przy drugim kompilowaniu dokumentu pakiety te nie są ładowane, dopóki nie unieważnisz pamięci podręcznej. W tym przypadku, jak zauważyłeś, nie jest plikiem cache/__packages i można odczytać pakietach nazwiska tam, więc

unique(c(.packages(), loadedNamespaces(), readLines('cache/__packages'))) 

Możesz uczynić kod bardziej wytrzymałe (na przykład sprawdzić, czy cache/__packages istnieje pierwszy) i wykluczyć niektóre pakiety z listy (np. knitr i jej przyjaciół), jak wskazał @ sebastian-c.

1

Problem z tym podejściem polega na tym, że \ Sexpr {} w bloku \ AtEndDocument {} w preambule jest oceniany na w dzierżawie (na początku pliku .Rnw, więc zwraca pustą listę. wygenerowany plik .tex, to pojawia się jako

\AtEndDocument{ 
\medskip 
\textbf{Packages used}: . 
} 

jedyny sposób to będzie działać ma zawierać kod, aby wygenerować ten tekst wyraźnie na koniec .Rnw złożyć (co w moim przypadku jest documenht dziecko , np.,

... 
\bibliography{graphics,statistics} 

Inside child document: 
\textbf{Packages used}: \Sexpr{setdiff(.packages(), 
     c("knitr", "stats", "graphics", "grDevices", "utils", "datasets", 
      "methods", "base"))}. 
+0

Nie powinieneś mieszać La Programowanie TeX z programowaniem R. R/knitr nie zna składni LaTeX. Jeśli chcesz uniknąć powtarzania tej części dokumentu, możesz po prostu umieścić ją w dokumencie podrzędnym, aby można ją było ponownie wykorzystać dla wszystkich dokumentów. –

Powiązane problemy