2013-03-12 13 views
23

In Knitr kann man die Größe der Zeichnung angeben, indem man sie einfach in den Chunk-Optionen angibt.Dynamische Höhe und Breite für Knitrollen

Zum Beispiel:

```{r, fig.width=9,fig.height=3} 
plot(x) 
``` 

Ich möchte in der Lage sein, dynamisch die Zahl Höhe und Breite auf der Basis von Variablen in x einzustellen. Nehmen wir an, dass x ein data.frame ist:

x <- data.frame(x=factor(letters[1:3]),y=rnorm(3)) 

Zum Beispiel willen können sagen, dass ich fig.height einstellen möchte gleich length(unique(x$x))

Antwort

15

Sie können zum Beispiel definieren die Breite in einem anderen Brocken, verwenden Sie es dann

```{r,echo=FALSE} 
x <- data.frame(x=factor(letters[1:3]),y=rnorm(3)) 
len = length(unique(x$x)) 
``` 


```{r fig.width=len, fig.height=6} 

plot(cars) 
``` 
+0

Ich mag diese Antwort, ich wünschte nur, es gäbe einen Weg, knitr in den aktuellen Chunk zu schauen (anstatt es vorher definieren zu müssen). Ich habe mit "vorher" gespielt und versucht zu sehen, ob ich etwas daraus machen kann. Bisher keine Würfel. –

+4

@BrandonBertelsen Ich verstehe das, aber "knitr" muss das grafische Gerät (mit einer geeigneten Größe) * vor * Auswertung des Chunks öffnen, so dass Sie den Code in einem vorherigen Chunk auswerten müssen, um die Objekte in einem letzteren zu verwenden Stück. –

+0

@BrandonBertelsen Ich kann nicht besser als Yihui sagen. Nur für mich ist es besser für die Lesbarkeit, alle Parameter in einem Chunck zu setzen, zum Beispiel init.chunck. – agstudy

0

eine Abhilfe dieses Problem, vor allem, wenn Sie Zahl Parameter innerhalb einer Schleife ändern möchten,

  1. definieren einen weiteren Brocken, eine Funktion, die die Schleife
  2. separat definieren die Abbildung Details in den folgenden Stücken

    ```{r, echo=FALSE} 
    testFunction <- function (parameter) { 
        x <- data.frame(x=c(1:parameter), y=rnorm(parameter)) 
        g1 <- ggplot(data=x, aes(x=x, y=y)) + geom_point() 
        print(g1) 
    } 
    ``` 
    
    
    ```{r fig.width=10, fig.height=6} 
    testFunction(10) 
    ``` 
    
    
    ```{r fig.width=5, fig.height=4} 
    testFunction(4) 
    ``` 
    
1

Ich habe gerade eine große Blog-Post über diese ausführt.

Lesen Sie mehr at Michael J Williams' blog - Ich habe schamlos den Code gestohlen, so dass mehr Details dort. Denken Sie daran, Chunk-Optionen auf results = "asis" zu setzen.

Angenommen, Sie möchten eine Reihe von Plots mit einer Schleife ausgeben, aber Sie möchten, dass sie verschiedene Größen haben. Definieren Sie die folgende Funktion (wieder, ich bin einfach kopieren-Einfügen hier):

subchunkify <- function(g, fig_height=7, fig_width=5) { 
    g_deparsed <- paste0(deparse(
    function() {g} 
), collapse = '') 

    sub_chunk <- paste0(" 
    `","``{r sub_chunk_", floor(runif(1) * 10000), ", fig.height=", 
    fig_height, ", fig.width=", fig_width, ", echo=FALSE}", 
    "\n(", 
    g_deparsed 
    , ")()", 
    "\n`","`` 
    ") 

    cat(knitr::knit(text = knitr::knit_expand(text = sub_chunk), quiet = TRUE)) 
} 

Und verwenden Sie die Funktion wie diese, die Definition einer eigenen Figur Größen:

```{r echo=FALSE, results='asis'} 
g <- ggplot(economics, aes(date, unemploy)) + 
    geom_line() 
subchunkify(g, 10, 3) 
subchunkify(g, 7, 7) 
``` 

oder lassen Sie die Daten definieren die Größen:

```{r echo=FALSE, results='asis'} 
g <- ggplot(economics, aes(date, unemploy)) + 
    geom_line() 
for (i in seq(2, 5)) { 
    subchunkify(g, i/2, i) 
} 
``` 

In der Zeit nach Michael warnt davor, dass man vorsichtig sein muss:

Da wir results = 'asis' verwenden, wenn wir Text oder Überschriften oder irgendetwas anderes aus dem Chunk ausgeben wollen, müssen wir Raw HTML und nicht Markdown verwenden, und dazu müssen wir cat() verwenden. nicht drucken(). Zum Beispiel:

g <- ggplot(economics, aes(date, unemploy)) + 
    geom_line() 

cat('<h2>A Small Square Plot</h2>') 
subchunkify(g, 3, 3) 

Auch nicht meine Arbeit ... Kopf auf mehr als auf diese lovely blog post für weitere Details. Hoffe das funktioniert für dich.

+0

Ich musste die letzte Zeile der 'subchunkify' Funktion so modifizieren, dass sie 'cat (trimws (knitr :: knit (text = knitr :: strick_expand (text = sub_chunk), quiet = TRUE)))' 'liest. Dann hat alles super geklappt. –