2015-10-20 14 views
7

mam rozszerzenie dwa pytania poprosiłem wcześniej:Put rysunek bezpośrednio w dokumencie Knitr (bez zapisywania pliku z niego w folderze) Część 3

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.

+2

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

+1

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

Odpowiedz

1

Kod, który podasz, daje mi ostrzeżenie o wyrażeniu typu Sweave: \SweaveOpts{concordance=TRUE} Jeśli to usuniemy, strona kompiluje się dla mnie (z licznymi błędami skrzynki) i tworzy plik PDF z grafiką w systemie Windows (i Ubuntu).

Nie jestem również pewny, dlaczego chcesz określić swój własny katalog tymczasowy: czy knitr nie zajmuje się tym za Ciebie?

Zainstalowałem świeżo zainstalowany MikTex i zaktualizowałem go (liczne pakiety miały 4 lub 5 lat, zaraz po instalacji).

Próbowałem z R-devel i R-3.2.2:

> sessionInfo() 
R version 3.2.2 (2015-08-14) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 7 x64 (build 7601) Service Pack 1 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] ggplot2_1.0.1 xtable_1.7-4 knitr_1.11 

loaded via a namespace (and not attached): 
[1] Rcpp_0.12.0  digest_0.6.8  MASS_7.3-44  grid_3.2.2  plyr_1.8.3  gtable_0.1.2  formatR_1.2  
[8] magrittr_1.5  evaluate_0.7.2 scales_0.3.0  stringi_0.5-5 reshape2_1.4.1 labeling_0.3  proto_0.3-10  
[15] tools_3.2.2  stringr_1.0.0 munsell_0.4.2 colorspace_1.2-6 

sessionInfo() 
R Under development (unstable) (2015-09-27 r69432) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 7 x64 (build 7601) Service Pack 1 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] ggplot2_1.0.1 xtable_1.7-4 knitr_1.11 

loaded via a namespace (and not attached): 
[1] Rcpp_0.12.0  digest_0.6.8  MASS_7.3-44  grid_3.3.0  plyr_1.8.3  gtable_0.1.2  formatR_1.2  
[8] magrittr_1.5  evaluate_0.7.2 scales_0.3.0  stringi_0.5-5 reshape2_1.4.1 labeling_0.3  proto_0.3-10  
[15] tools_3.3.0  stringr_1.0.0 munsell_0.4.2 colorspace_1.2-6