2012-06-16 21 views
26

Gibt es eine Möglichkeit, die Funktion round() zu vermeiden, wenn Sweave/Knitr verwendet wird? Es ist wirklich ärgerlich, round(,2) in jedem zu schreiben. Ich möchte über das ganze Dokument zwei Dezimalstellen haben.Wie vermeidet man die Verwendung von round() in jedem Sexpr {}?

Danke für Ihre Hilfe
Macs

+0

IMHO könnten Sie einen [Hook] (http://yihui.name/knitr/hooks) dafür einstellen. Oder versuchen Sie [pander] (http://daroczig.github.com/pander/), was das automatisch macht. – daroczig

+1

Möchten Sie die Ausgabe auf zwei Stellen begrenzen, oder wollen Sie immer zwei Ziffern, auch wenn sie es sind Null ('1.00')? Das erste Mal sollte es möglich sein, mit "Optionen (Ziffern = 2)" in Ihrem ersten Chunk zu setzen. – vaettchen

+0

@vaettchen: Wenn Sie 'digits 'auf' 2' setzen, erhalten Sie 'pi * 100' als' 314', was eine ziemlich grobe Schätzung ist. – daroczig

Antwort

34

Wenn Sie the motivation des knitr package gelesen haben, wissen Sie wahrscheinlich ich die Person bin, die round() innerhalb \Sexpr{} meisten hasst. Ich habe dies vor langer Zeit für Sweave vorgeschlagen, aber es wurde ignoriert, also habe ich mein eigenes Paket gestartet.

Obwohl die Antwort von Josh O'Brien absolut korrekt ist, sollte ich sagen, dass Sie wirklich nur options(digits = 2) mit knitr benötigen und es keine Notwendigkeit gibt, den Standard-Inline-Hook zurückzusetzen, da der Standard-Hook diese Option respektiert.

+2

Danke für diesen Hinweis. Es ist wirklich eine große Erleichterung. Ich bin ein ziemlich Anfänger in der Arbeit mit R und LaTeX, aber trotzdem sind die Vorteile gegenüber Swave ziemlich offensichtlich. Ich denke in kurzer Zeit werden die meisten Leute zu Knitr gewechselt haben. – beginneR

12

In knitr, das kann Inline Haken die Ausgabe von \Sexpr{} Aussagen zu verarbeiten verwendet werden. Also, wenn Sie für die Inline-Code nur 2 Nachkommastellen drucken möchten (während die Gesamt digits Option allein lassend) Sie so wie dies tun können:

## 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 - ordentlich, wie dies fügt die Fähigkeit hinzu, zwischen Inline- und Chunk-Darstellung zu unterscheiden! – petermeissner

+1

@PeterM - Absolut! [Siehe Baptistes Antwort hier] (http://stackoverflow.com/questions/16405536/knitr-inline-chunk-options-no-evaluation-or-just-render-highlighted-code) für ein anderes (sehr nützliches) Beispiel von a kundengebundener Inline-Haken. –

5

Zuerst möchten Sie vielleicht formatC statt round verwenden um zwei Ziffern zu erhalten, auch wenn sie Null sind. Es gibt keine großartige Möglichkeit, dies in Sweave zu tun; Die beste Option besteht wahrscheinlich darin, eine neue Funktion mit einem kurzen Namen zu erstellen, der die von Ihnen gewünschte Formatierung ausführt. so etwas wie

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

Das ist zumindest ein wenig Tipparbeit erspart:

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

Leider ohne mit einem neuen Sweave Fahrer über Ausmisten, ich glaube nicht, dass es etwas anderes (vielleicht, dies zu tun ist ein weiterer Grund, knitr zu versuchen, die schnell an Boden gewinnt). Sweave macht das auf, was in Ihrer Sexpr Anweisung ist, und ersetzt dann den Sexpr Aufruf mit dem Ergebnis.

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

Sie können jedoch nicht nur eine neue Version von as.character schreiben; Abgesehen von dem Problem, dass es das Verhalten auf andere unerwartete Weise ändern könnte, ruft es aufgrund des Namespacings immer die Version in base auf, selbst wenn es eine andere Version in der globalen Umgebung gibt.

+0

Es ist so natürlich, an dunkle Voodoos mit Sweave zu denken :) Du weißt genau, wo Sweave sich ändern sollte, und das habe ich auch R Core vorgeschlagen (sie können es besser nicht nur mit 'as.character' machen) und von ihnen ignoriert werden . –

+0

Ja, dunkle Voodoos in der Tat. Ich habe ein paar Varianten Treiber sitzen herum, die hinzufügen, bestimmte Funktionalität, die ich brauche, aber sie sind ein Schmerz zu schreiben und zu pflegen. Ich höre immer wieder gute Dinge über "Knitr" und wie es viele Dinge einfacher macht. Hoffe, es bald zu versuchen. Danke für deine Arbeit, @Yihui. – Aaron

+0

+1 für die Antwort der Komponente Sweave der Frage – petermeissner

Verwandte Themen