2014-10-15 2 views
5

definiere ich einen Haken an der Spitze meiner rnw ‚000s mit Komma zu trennen:knitr Haken 000 ist zu trennen, aber seit Jahren nicht mehr

knit_hooks$set(inline = function(x) { 
     prettyNum(x, big.mark=",") 
    }) 

Allerdings gibt es einige Zahlen, die ich will nicht Format wie dieses, wie Jahre. Gibt es eine bessere Möglichkeit, den Haken zu schreiben, oder eine Möglichkeit, den Haken zu überschreiben, wenn ich im folgenden Beispiel \Sexpr{nocomma} drucke?

\documentclass{article} 

\begin{document} 

<<setup>>= 
    library(knitr) 
    options(scipen=999) # turn off scientific notation for numbers 
    opts_chunk$set(echo=FALSE, warning=FALSE, message=FALSE) 
    knit_hooks$set(inline = function(x) { 
     prettyNum(x, big.mark=",") 
    }) 
    wantcomma <- 1234*5 
    nocomma <- "September 1, 2014" 
@ 

The hook will separate \Sexpr{wantcomma} and \Sexpr{nocomma}, but I don't want to separate years. 

\end{document} 

Ausgang:

Der Haken trennt 6170 und 1. September 2014, aber ich will nicht Jahre trennen.

Antwort

6

Wenn die einzigen Dinge, die Sie nicht wollen, durch Kommas getrennt sind Strings, die Jahre in, Gebrauch hat:

knit_hooks$set(inline = function(x) { 
     if(is.numeric(x)){ 
      return(prettyNum(x, big.mark=",")) 
     }else{ 
      return(x) 
     } 
    }) 

, die für Ihren Kalender String funktioniert. Aber nehmen wir einmal an, Sie möchten einfach nur eine Jahreszahl drucken? Nun, wie über die oben genannten Haken verwenden und Umwandeln in Zeichen:

What about \Sexpr{2014}? % gets commad 
What about \Sexpr{as.character(2014)}? % not commad 

oder möglicherweise (nicht getestet):

What about \Sexpr{paste(2014)}? % not commad 

die den Skalar Zeichen umwandelt und speichert ein Bit der Eingabe. Wir sind nicht hier spielen Code Golf obwohl ...

Alternativ kann eine klassenbasierte Methode:

comma <- function(x){structure(x,class="comma")} 
    nocomma <- function(x){structure(x,class="nocomma")} 

    options(scipen=999) # turn off scientific notation for numbers 
    opts_chunk$set(echo=FALSE, warning=FALSE, message=FALSE) 
    knit_hooks$set(inline = function(x) { 
     if(inherits(x,"comma")) return(prettyNum(x, big.mark=",")) 
     if(inherits(x,"nocomma")) return(x) 
     return(x) # default 
    }) 
    wantcomma <- 1234*5 
    nocomma1 <- "September 1, 2014" # note name change here to not clash with function 

Dann wird Ihr gerade wickeln Sexpr in entweder comma oder nocomma wie:

The hook will separate \Sexpr{comma(wantcomma)} and \Sexpr{nocomma(nocomma1)}, but I don't want to separate years. 

Wenn Sie möchten, dass der Standardwert commaify ist, und ändern Sie dann die Zeile "# default", die kommentiert werden soll, um prettyNum zu verwenden. Obwohl ich denke, ich habe dies kompliziert und die comma und nocomma Funktionen könnten nur das String-Format selbst berechnen und dann würden Sie überhaupt keinen Haken benötigen.

Ohne genau Ihre Fälle zu kennen, glaube ich nicht, dass wir eine Funktion schreiben können, die das Komma-Sep-Schema leitet - zum Beispiel müsste es wissen, dass "1342 Fälle im Jahr 2013" seine erste Zahl commad und nicht seine zweite benötigt ...

+0

Danke, @ Spacedman. Das funktioniert und beantwortet die Frage, die ich gestellt habe, also werde ich es akzeptieren. In meinem tatsächlichen Anwendungsfall habe ich einige Zahlen, die wie Strings gespeichert sind, genau wie meine Daten, aber ich möchte, dass sie durch Kommas getrennt sind. Für mich bringt 'is.numeric()' mich näher, aber nicht ganz da. Ich war nicht in der Lage, einen Weg zu finden, den Haken selektiv in Reihe oder Stück für Stück abzuschalten. Ich wäre neugierig, wenn Sie oder andere darüber nachdenken würden. Fürs Erste werde ich 'is.numeric()' verwenden und einige andere Arbeitsumgebungen durchführen, um es zu meinem Fall zu passen. –

+0

nette Zugabe. ich änderte eins wenn 'if (! erbt (x," nocomma ")) return (prettyNum (x, big.mark =", "))' 'so dass ich' nocomma() 'nur dann verwenden muss, wenn Ich möchte vom Komma abweichen. –