2012-06-16 4 views
26

C'è un modo per evitare la funzione round() quando si usa Sweave/knitr? È davvero fastidioso scrivere round(,2) in ogni \Sexpr{}. Mi piacerebbe avere due cifre decimali attraverso l'intero documento.Come evitare di usare round() in ogni Sexpr {}?

Grazie per il vostro aiuto
Mac

+0

IMHO è possibile impostare un [gancio] (http://yihui.name/knitr/hooks) per quello. Oppure prova [pander] (http://daroczig.github.com/pander/) che lo fa automaticamente :) – daroczig

+1

Vuoi limitare l'output a due cifre max o vuoi sempre due cifre, anche se sono zero ('1.00')? Il primo che dovresti essere in grado di ottenere con l'impostazione di 'opzioni (cifre = 2)' nel tuo primo blocco. – vaettchen

+0

@vaettchen: impostando 'cifre 'su' 2', si otterrebbe 'pi * 100' come' 314', che è una stima piuttosto approssimativa. – daroczig

risposta

34

Se avete letto the motivation del knitr package, probabilmente sapete io sono la persona che odia round() all'interno \Sexpr{} più. L'ho suggerito a R core molto tempo fa per Sweave ma è stato ignorato, così ho iniziato il mio pacchetto.

Anche se la risposta di Josh O'Brien è assolutamente corretto, devo dire è davvero solo bisogno options(digits = 2) con knitr, e non v'è alcuna necessità di ripristinare il gancio di default in linea perché i punti di gancio di default questa opzione.

+2

Grazie per questo suggerimento. È davvero un grande sollievo. Sono abbastanza un principiante nel lavoro con R e LaTeX, ma tuttavia i vantaggi rispetto a Sweave sono abbastanza ovvi. Penso che in breve tempo la maggior parte delle persone sarà cambiata in knitr. – beginneR

12

Nel knitr, il gancio linea possono essere utilizzati per elaborare l'output di \Sexpr{} dichiarazioni. Quindi, se si desidera stampare solo 2 cifre dopo il decimale per codice inline (lasciando solo l'opzione complessiva digits) è possibile farlo in questo modo:

## First have a look at the default inline hook function 
knit_hooks$get("inline") 

## Then customize it to your own liking 
inline_hook <- function(x) { 
    if(is.numeric(x)) x <- round(x, 2) 
    paste(as.character(x), collapse=", ") 
} 
knit_hooks$set(inline = inline_hook) 
+0

+1 - pulito, come questo aggiunge l'abbabilità per distinguere tra l'aspetto inline e chunk! – petermeissner

+1

@PeterM - Assolutamente! [Vedi la risposta di baptiste qui] (http://stackoverflow.com/questions/16405536/knitr-inline-chunk-options-no-evaluation-or-just-render-highlighted-code) per un altro (molto utile) esempio di gancio in linea personalizzato. –

5

In primo luogo, è forse desidera utilizzare formatC invece di round per ottenere due cifre anche quando sono zero. Non c'è un ottimo modo per farlo in Sweave; l'opzione migliore è probabilmente semplicemente creare una nuova funzione con un nome breve che faccia la formattazione desiderata; qualcosa come

p <- function(x) {formatC(x, format="f", digits=2)} 

Questo almeno risparmiare un po 'di battitura:

The answer is $\Sexpr{p(x)}$. 

Purtroppo, senza pasticciare in giro con un nuovo driver Sweave, non credo che ci sia niente altro da fare (forse questo è un altro motivo per provare knitr, che sembra guadagnare terreno velocemente). Sweave sta facendo questo su cosa c'è dentro la tua istruzione Sexpr e poi sostituendo la chiamata Sexpr con il risultato.

as.character(eval(parse(text = cmd), envir = .GlobalEnv)) 

Tuttavia, non è possibile scrivere una nuova versione di as.character; a parte il problema che potrebbe modificare il comportamento in altri modi imprevisti, a causa del namespace, chiama sempre la versione in base anche se esiste un'altra versione nell'ambiente globale.

+0

È così naturale pensare ai dark voodoos con Sweave :) Sai esattamente dove Sweave dovrebbe cambiare, e questo è anche quello che ho suggerito a R core (possono fare meglio non solo usando 'as.character') e ignorati da loro . –

+0

Sì, davvero bui voodoos. Ho un paio di varianti di driver in giro che aggiungono alcune funzionalità di cui ho bisogno, ma sono un dolore da scrivere e mantenere. Continuo a sentire cose positive su 'knitr' e su come rende molte cose più facili. Spero di provarlo presto. Grazie per il tuo lavoro, @Yihui. – Aaron

+0

+1 per aver risposto al componente di sweave della domanda – petermeissner