2014-07-05 21 views
17

Ich habe einen Projektordner, der mein Arbeitsverzeichnis ist. Nennen wir es Projekt. Unter dem Projekt Ordner sind 4 Unterverzeichnisse: code, data, figures und documents.Arbeiten mit Knitr mit Unterverzeichnissen

Ich möchte meine .Rmd Datei in das code Unterverzeichnis legen. Ich möchte, dass die Zahlen in das Unterverzeichnis figures gehen. Ich möchte die .html, .md und .docx Datei (en) in das documents Unterverzeichnis gehen. Ich möchte meine Daten aus dem Unterverzeichnis data einlesen. Ist diese Organisationsstruktur möglich? Ich kann es nicht zur Arbeit bringen.

Ich beginne damit das Arbeitsverzeichnis auf project zu setzen, weil ich weiß, dass Knitr auf den Ordner mit der .Rmd Datei schaut und behandelt es als Arbeitsverzeichnis, wenn dies nicht angegeben ist.

Dann versuche ich, die Abbildung Pfad relativ zum Arbeitsverzeichnis.

```{r setchunk, cache=FALSE, include=TRUE} 
opts_chunk$set(fig.path = "./figures/") 
getwd() 
``` 

Das Arbeitsverzeichnis wird korrekt als project gemeldet. Die Daten werden korrekt aus dem Unterverzeichnis data gelesen. Alle Ausgaben werden ordnungsgemäß gerendert und der gesamte Code wird ausgeführt.

```{r readdata} 
crctx <- readRDS("./data/crctx.rds") 
getwd() 
*run lots of analyses here* 
``` 

Aber die Zahlen am Ende statt project/figures im project/code/figures Verzeichnis auf.

Ich habe auch versucht, base.dir Einstellung, aber das scheint nichts zu ändern. Ich habe den Parameter

base.dir = "./figures" 

auf die opts_knit$set Liste. Ich habe sogar versucht, den vollständigen Pfad zu codieren. Aber nichts scheint das zu ändern.

Ich benutze R 3.10 und RStudio 0.98.953. Das ist Mac 0SX 10.9.4.

Fehle ich etwas? Und gibt es eine Möglichkeit, die Ausgabedateien in ein eigenes Verzeichnis zu stellen?

Der Grund, warum dies wichtig ist, ist, dass ich möchte, dass unser Unternehmen die gleiche Verzeichnisstruktur verwendet, und dies ermöglicht uns, unsere Projekte besser zu organisieren.

Vielen Dank im Voraus für jede Hilfe.

Update:

Ich weiß, dass opts_chunk$set(fig.path = "./figures/") falsch ist. Ich nahm an, dass das Setzen des Wurzelverzeichnisses auf den Projektordner unter Verwendung von opts_knit$set(root.dir = normalizePath("../")) eine globale Änderung an knitr vornehmen würde, da dies genau das ist, was es tun soll. Und es funktioniert auch für das Unterverzeichnis data, auf das jetzt mit "./data" zugegriffen werden kann, wodurch der Code ausgeführt werden kann. Die globale Einstellung gilt jedoch nicht für die Zahlenausgabe. Daher lautet die korrekte Spezifikation opts_chunk$set(fig.path = "../figures/") - unter Verwendung von ../ anstelle von ./. Ich glaube, Richie Cotton hat das repariert, und ich habe es eine ganze Weile nicht gesehen.

Ich verwendete auch Terminal in OSX, um eine symbolische Verbindung von project/documents zu project/code/figure zu erstellen, die standardmäßig von knitr erstellt wird. Damit schaut knitr in das richtige Unterverzeichnis, aber alles endet in projects/documents. Das hat wirklich gut funktioniert. Ich kann R nicht richtig erstellen, um den symbolischen Link ordnungsgemäß mit file.symlink zu erstellen. Aber es funktioniert gut in Terminal. Stelle dir das vor.

Update 2:

bekam ich die Ausgabedateien als gut zu funktionieren. Sie müssen den Strickbefehl direkt verwenden. Der Text ist unten.

Knitr Code zu stricken einen Abschlag Dokument mit .Rmd in Code/Analyse und Ausgabe in der Ausgabe/Berichten: knit("./code/knitr_file.Rmd", "./documents/knitr_output.md”)

Pandoc Code .md-Datei zu konvertieren .docx - nutzt die gleichen Ordner wie die. Datei md pandoc("./documents/knitr_output.md", format = "docx”)

Ausgabestile (von knitr Dokumentation)

pandoc('knitr_output.md', format='html') # HTML pandoc('knitr_output.md', format='latex') # LaTeX/PDF pandoc('knitr_output.md', format='docx') # MS Word pandoc('knitr_output.md', format='odt') # OpenDocument

+0

Sehen Sie, wenn [ 'normalizePath'] (http://stackoverflow.com/questions/19882198/trouble-finding-file-source-in-rmd-chunk-when-knitting-rmd-from-master- r-Datei) funktioniert für Sie. –

+0

Ich schaute auf die Syntax, und ich konnte nicht herausfinden, was das tun sollte. Aber ich kann noch einen Blick darauf werfen. –

Antwort

8

Versuchen Sie dies. Es setzt voraus, dass Sie die vier Ordner haben, die Sie im Arbeitsverzeichnis project aufgeführt haben. Es nimmt auch an, dass Sie eine .csv Datei haben, die myData.csv in data genannt wird.

Wenn Sie die Datei stricken, wird das Diagramm in figures gespeichert. Am Ende sucht der Code nach html Dateien in code und verschiebt sie zu documents. Es gibt wahrscheinlich einen besseren Weg, dies zu tun.

```{r setup} 
    library(knitr) 
    opts_knit$set(root.dir=normalizePath('../')) 
    opts_chunk$set(fig.path = "../figures/", dev='pdf') # corrected path and added dev 
``` 

```{r import} 
    dat <- read.csv("data/myData.csv") 
``` 

```{r plot} 
    # pdf(file="figures/test.pdf") # I do this in setup instead 
    plot(dat) 
    # dev.off() 
``` 

```{r move} 
    files <- list.files("code/") 
    index <- grep("html", files) 
    file.rename(file.path("code", files[index]), 
       file.path("documents", files[index])) 
``` 
+0

Ich konnte den Figurteil mit 'opts_knit $ set (root.dir =" ../"); opts_chunk$set(fig.path = "../ figures/test -") 'erreichen. Ich habe '../' versucht, nachdem du deinen Beitrag als '..' gesehen hast, alleine würde nicht funktionieren, grrr. –

+0

@eric Vielen Dank. Ich verstehe normalizePath jetzt, aber das hat nicht funktioniert. Ich habe auch versucht, 'paste (getwd(),"/figures/", sep =" "))' 'zu verwenden, was ein manueller Weg zum' normalizePath() 'ist und das nicht funktioniert hat. Ich mag den manuellen Umzug. Ich denke, vielleicht kann ein Aufruf von "stricken", anstatt auf den Button klicken, die Ausgabedatei .md zu setzen. Dann könnte ein Aufruf von Pandoc für das Setzen der Ausgabedokumente .docx oder .pdf funktionieren. Ich muss mir das ansehen. –

+0

Hmmm, es funktioniert für mich. Versuchen Sie, den Ordner '/ dir 'aus [diesem GitHub-Repository] (https://github.com/ericpgreen/Rcode/tree/master/dir) zu greifen. Stellen Sie sicher, 'setwd()' zu '/ dir'. Sie sollten nur klicken können "stricken". –

Verwandte Themen