2012-06-16 16 views
26

¿Hay alguna manera de evitar la función round() al usar Sweave/knitr? Es realmente molesto escribir round(,2) en cada \Sexpr{}. Me gustaría tener dos decimales en todo el documento.¿Cómo evitar el uso de round() en cada Sexpr {}?

Gracias por su ayuda
Macs

+0

En mi humilde opinión podría establecer un [gancho] (http://yihui.name/knitr/hooks) para eso. O pruebe [pander] (http://daroczig.github.com/pander/) que lo hace automáticamente :) – daroczig

+1

¿Desea limitar la salida a dos dígitos como máximo, o siempre quiere dos dígitos, incluso si son cero ('1.00')? Lo primero que debería poder lograr con la configuración de 'options (digits = 2)' en su primer fragmento. – vaettchen

+0

@vaettchen: estableciendo 'dígitos' en '2', obtendría 'pi * 100' como' 314', que es una estimación bastante aproximada. – daroczig

Respuesta

34

Si ha leído the motivation del knitr package, usted probablemente sabe que soy la persona que odia round() dentro \Sexpr{} más. Sugerí esto al núcleo R hace mucho tiempo para Sweave pero fue ignorado, así que comencé mi propio paquete.

Aunque la respuesta de Josh O'Brien es absolutamente correcta, debo decir que realmente solo necesita options(digits = 2) con knitr, y no hay necesidad de restablecer el enganche en línea predeterminado porque el gancho predeterminado respeta esta opción.

+2

Gracias por este consejo. Es realmente un gran alivio. Soy bastante principiante en el trabajo con R y LaTeX, pero, sin embargo, las ventajas sobre Sweave son bastante obvias. Creo que en poco tiempo la mayoría de la gente habrá cambiado a knitr. – beginneR

12

En knitr, el gancho línea se pueden utilizar para procesar la salida de \Sexpr{} declaraciones. Por lo tanto, si desea imprimir sólo 2 dígitos después del punto decimal para el código en línea (dejando la opción general digits solo), puede hacerlo de esta manera:

## 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 - limpio, como este ¡Agrega la habilidad de abatir para distinguir entre apariencia en línea y trozo! – petermeissner

+1

@PeterM - ¡Absolutamente! [Vea la respuesta de Baptiste aquí] (http://stackoverflow.com/questions/16405536/knitr-inline-chunk-options-no-evaluation-or-just-render-highlighted-code) para otro ejemplo (muy útil) de un gancho en línea personalizado. –

5

En primer lugar, tal vez desee utilizar formatC en lugar de round para obtener dos dígitos, incluso cuando son cero. No hay una gran manera de hacer esto en Sweave; la mejor opción es, probablemente, simplemente crear una nueva función con un nombre corto que tenga el formato que desee; algo así como

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

Eso, al menos, ahorra un poco de escribir:

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

Por desgracia, sin curioseaba con un nuevo controlador Sweave, no creo que haya nada más que hacer (tal vez esto es otra razón para probar knitr, que parece estar ganando terreno rápidamente). Sweave está haciendo esto en lo que está dentro de su declaración Sexpr, y luego reemplazando la llamada Sexpr con el resultado.

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

Sin embargo, no se puede simplemente escribir una nueva versión de as.character; aparte del problema de que podría cambiar el comportamiento de otras formas inesperadas, debido al espacio de nombres, siempre llama a la versión en base, incluso si hay otra versión en el entorno global.

+0

Es tan natural pensar en vudú oscuros con Sweave :) Sabes exactamente dónde debe cambiar Sweave, y esto es también lo que sugerí a R core (pueden hacerlo mejor no solo usando 'as.character') e ignorado por ellos . –

+0

Sí, oscuros vudú de hecho. Tengo un par de variantes de controladores por ahí que agregan cierta funcionalidad que necesito pero son un dolor para escribir y mantener. Sigo escuchando cosas buenas sobre 'knitr' y cómo hace que muchas cosas sean más fáciles. Espero probarlo pronto Gracias por tu trabajo en ello, @Yihui. – Aaron

+0

+1 para responder al componente sweave de la pregunta – petermeissner

Cuestiones relacionadas