2014-12-02 11 views
14

So che questa domanda è simile a this uno. Ma non sono riuscito a trovare una soluzione così da postarla di nuovo qui.Come replicare Knit HTML in una riga di comando?

Voglio ottenere esattamente lo stesso risultato ottenuto facendo clic su "Knit HTML" ma tramite un comando. I tryied usando knit2html ma pasticci con la formattazione e non include il titolo, kable non funziona ecc

Esempio:

Questo è il mio file test.Rmd,

--- 
title: "test" 
output: html_document 
--- 

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>. 

When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this: 

```{r} 
library(knitr,quietly=T) 
kable(summary(cars)) 
``` 

You can also embed plots, for example: 

```{r, echo=FALSE} 
plot(cars) 
``` 

Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot. 

uscita:

Knit HTML

enter image description here

knit2html

enter image description here

+0

FWIW preferisco l'uscita di linea di comando. –

+0

@KonradRudolph: Non funzionerà per me. Questo è solo un codice di esempio che ho inventato. Il mio caso d'uso reale ha una grande tabella con 8 colonne e 10 righe. L'output della riga di comando apparirà brutto. – Avinash

+1

Questo è principalmente dovuto al fatto che entrambe le opzioni (!) Formattano male le tabelle per impostazione predefinita. Vedi la mia risposta per un'opzione migliorata. –

risposta

13

Il documentation ci dice:

Se non si utilizza RStudio allora avete semplicemente bisogno di chiamare la funzione rmarkdown::render, ad esempio:

rmarkdown::render("input.Rmd") 

Si noti che nel caso in cui si utilizza il Pulsante "Knit" in RStudio il meccanismo di base è lo stesso (RStudio chiama la funzione rmarkdown::render sotto il cofano).

In sostanza, rmarkdown::render fa molto di più messa a punto di knitr::knit2html, anche se non ho un elenco esaustivo di tutte le differenze.

Il modo più flessibile per rendere l'output è, in ogni caso, fornire il proprio foglio di stile per formattare l'output secondo i propri desideri.

Si prega di notare che è necessario set up Pandoc manually per funzionare con rmarkdown::render sulla riga di comando.


Detto, qui ci sono due osservazioni che potrebbero migliorare la knitr::knit2hmtl uscita, e che sono superiori a utilizzare rmarkdown::render a mio parere:

  • Per includere il titolo, un titolo, Markdown tag, non è un tag YAML:

    # My title 
    
  • Per formattare le tabelle, non utilizzare le materie prime 0.123.funzione. In realtà, questo è vero anche quando si utilizza rmarkdown::render: l'allineamento delle celle della tabella è completamente disattivato. Rmarkdown apparentemente utilizza il centraggio come allineamento predefinito ma questa opzione non è quasi mai corretta. Invece, dovresti allineare il testo a sinistra e (generalmente) i numeri allineati a destra.Momento in cui scriviamo, Knitr non può farlo automaticamente (per quanto ne so), ma è abbastanza facile da includere un filtro per fare questo per voi:

    ```{r echo=FALSE} 
    library(pander) 
    
    # Use this option if you don’t want tables to be split 
    panderOptions('table.split.table', Inf) 
    
    # Auto-adjust the table column alignment depending on data type. 
    alignment = function (...) UseMethod('alignment') 
    alignment.default = function (...) 'left' 
    alignment.integer = function (...) 'right' 
    alignment.numeric = function (...) 'right' 
    
    # Enable automatic table reformatting. 
    opts_chunk$set(render = function (object, ...) { 
        if (is.data.frame(object) || 
         is.matrix(object)) { 
         # Replicate pander’s behaviour concerning row names 
         rn = rownames(object) 
         justify = c(if (is.null(rn) || length(rn) == 0 || 
             (rn == 1 : nrow(object))) NULL else 'left', 
            sapply(object, alignment)) 
         pander(object, style = 'rmarkdown', justify = justify) 
        } 
        else if (isS4(object)) 
         show(object) 
        else 
         print(object) 
    }) 
    ``` 
    
+0

Per ora, uso solo la funzione di rendering e ho funzionato. Ma capisco cosa intendi per cattivo design. Uso l'opzione di allineamento di kable per dare il mio allineamento per colonna. Per la tua soluzione, l'ho messo come primo pezzo di codice e dovrei essere impostato correttamente? – Avinash

+1

Sì, esattamente. Ovviamente l'uso dell'opzione di allineamento di kable funziona anche in linea di principio. Il motivo per cui sto usando pander è che è generalmente abbastanza potente. –

+2

Per un migliore allineamento della colonna predefinito con ** pander **, vedere anche 'panderOptions ('table.alignment.default')', come ad es. [Qui] (http://stackoverflow.com/a/27014481/980833). –

Problemi correlati