mam rozszerzenie dwa pytania poprosiłem wcześniej:Put rysunek bezpośrednio w dokumencie Knitr (bez zapisywania pliku z niego w folderze) Część 3
- Put figure directly into Knitr document (without saving file of it in folder)
- Put figure directly into Knitr document (without saving file of it in folder) Part 2
Piszę Pakiet R, który generuje plik .pdf dla użytkowników, który generuje zestawienia danych. Mam skrypt .Rnw w pakiecie (tutaj, mój MWE z niego nazywa się test.Rnw). Użytkownik może zrobić:
knit2pdf("test.Rnw", clean=T)
To sprawia, że proces dla nich łatwe, ponieważ automatycznie tworzy plik .pdf z pliku .tex i kasuje niepotrzebne pliki dla nich (.aux i .log, na przykład). Przechowuje również wszelkie obrazy w katalogu tymczasowym (przy użyciu tempdir()), które następnie zostaną rutynowo usunięte przez system po ich włączeniu do plików .tex i .pdf. Oznacza to, że nie muszą również usuwać plików obrazów.
Poniżej jest moje test.Rnw MWE:
\documentclass[nohyper]{tufte-handout}
\usepackage{tabularx}
\usepackage{longtable}
\setcaptionfont{% changes caption font characteristics
\normalfont\footnotesize
\color{black}% <-- set color here
}
\begin{document}
<<setup, echo=FALSE>>=
library(knitr)
library(xtable)
library(ggplot2)
# Specify directory for figure output in a temporary directory
temppath <- tempdir()
opts_chunk$set(fig.path = temppath)
@
<<diamondData, echo=FALSE, fig.env = "marginfigure", out.width="0.95\\linewidth", fig.cap = "The diamond dataset has varibles depth and price.",fig.lp="mar:">>=
print(qplot(depth,price,data=diamonds))
@
<<echo=FALSE,results='asis'>>=
myDF <- data.frame(a = rnorm(1:10), b = letters[1:10])
print(xtable(myDF, caption= 'This data frame shows ten random variables from the distribution and a corresponding letter', label='tab:dataFrame'), floating = FALSE, tabular.environment = "longtable", include.rownames=FALSE)
@
Figure \ref{mar:diamondData} shows the diamonds data set, with the
variables price and depth.Table \ref{tab:dataFrame} shows letters a through j
corresponding to a random variable from a normal distribution.
\end{document}
Należy zauważyć, że w rzeczywistości jest inny plik .Rnw w moim pakiecie, który wywołuje plik test.Rnw poprzez:
knit2pdf("/inst/Rnw/test.Rnw","/path/test.tex",clean=T)
W każdym razie próbuję przygotować ten pakiet do przesłania do CRAN i napotkaliśmy dwa problemy:
1) Najpierw kłopotliwe pytanie: powyższy kod MWE wydaje się działać na Mac Sys tems, ale nie działa na systemach Windows! W systemie Windows wygenerowany plik .pdf nie zawiera obrazów. Po rozwiązaniu problemu myślę, że udało mi się rozwiązać problem, ale nadal nie mogę znaleźć rozwiązania.
Zasadniczo w systemie Windows wydaje się, że polecenie tempdir() utworzy ścieżkę z podwójnymi ukośnikami, takimi jak \\ this \\ is \\ myPath. Następnie w pliku .tex ścieżką do katalogu tymczasowego (zawierającego obrazy) są pojedyncze ukośniki, takie jak \ this \ is \ myPath. Jednak powinny to być pojedyncze ukośniki, takie jak/this/is/myPath, aby plik .tex znalazł obrazy zapisane w katalogu tymczasowym.
Rzeczywiście, jeśli I ręcznie zmienić tylne ukośniki, aby przesłać ukośniki w pliku .tex w systemie Windows, to mogę z powodzeniem przekonwertować go do pliku .pdf, który z powodzeniem zawiera obrazy.
Nie jestem pewien, jak rozwiązać ten problem w mojej składni. Myślałem, że to będzie łatwe rozwiązanie, ale jeśli po prostu zrobić coś takiego:
# Specify directory for figure output in a temporary directory
temppath <- tempdir()
gsub("\\\\", "/", temppath)
wówczas obrazy nie mogą być przechowywane w tymczasowym katalogu na Windows w pierwszej kolejności, nawet jeśli plik .tex będzie zawierać potrzebne są prawidłowe pojedyncze ukośne kreski. (Wierzę) ta sama zmienna jest używana do oznaczenia tymczasowej lokalizacji katalogu, a także lokalizacji obrazu w pliku .tex i muszą one w jakiś sposób mieć różne kierunki ukośne.
Jestem trochę zaskoczony, że nie pojawił się wcześniej (przynajmniej w moich badaniach). Może ludzie nie mają automatycznego usuwania obrazu podczas pracy z dzianinami?
2) Zastanawiam się, czy byłoby to do zaakceptowania dla mnie w moim drugim.Plik Rnw, dodaj drugą linię, aby zadzwonić:
knit2pdf("/inst/Rnw/test.Rnw","/path/test.tex",clean=T)
system(sprintf("%s", paste0("rm -r ", "/path/myFile.tex")))
Dzięki temu plik .tex może również zostać automatycznie usunięty. Próbuję potwierdzić, że taka składnia byłaby możliwa do zaakceptowania przez standardy CRAN, ponieważ wiąże się to z usuwaniem pliku z komputera użytkownika (co może wydawać się niebezpieczne/złośliwym oprogramowaniem), chociaż wskazuje konkretnie na plik .tex, który właśnie wygenerował, i więc nie powinno to usuwać niczego ważnego dla nich.
* Uwaga: Domyślnie kasuję wszystkie pliki pośredniczące, więc użytkownik zajmuje się tylko plikiem .pdf. Nadal jednak zezwalam użytkownikom na korzystanie z tej wartości domyślnej i przechowywanie tych plików pośredniczących, w razie potrzeby.
dokłada 'normalizePath (TempDir(), winslash = '/')' pomóc? wszystko zapisane w 'tempdir' zostanie usunięte po zakończeniu sesji r, więc nie musisz niczego usuwać jawnie. ale możesz "? rozłączyć" pliki 'on.exit' funkcji, która prawdopodobnie wolałaby wykonywać komendy systemowe – rawr
Po prostu chcę powiedzieć, że ta wersja pytania jest znacznie ulepszona z części 2 pod względem jakości i jasności pytania ! – Gregor