2014-10-15 22 views
5

için 000 en ayırmak, ancak değil gibi formatlar, yıllar gibi. Aşağıdaki örnekte \Sexpr{nocomma}'u yazdırdığımda kancayı yazmanın daha iyi bir yolu veya kancayı geçersiz kılacak bir yol var mı?knitr kanca Ben virgül ile '000s ayırmak için benim <code>rnw</code> üst kısmında bir kanca tanımlamak yıl

\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} 

Çıktı:

kanca 6,170 ayırmak ve 1 Eylül 2014, ama yıllar ayırmak istemiyorum olacaktır. Takvim dize için çalışır

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

:

cevap

6

senin istemiyoruz tek şey ise virgülle ayrılmış, kullanımda yıl var dizeleri bulunmaktadır. Ama sadece bir yıl numarayı kendi başına yazdırmak istediğinizi varsayalım? O kadar yukarıda kanca ile ve karakterine dönüştürme hakkında: muhtemelen

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

ya da (denenmemiş): karaktere skaler dönüştürür ve yazma biraz kaydeder

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

. Biz

Alternatif sınıf tabanlı yöntemi ... gerçi burada kod golf oynamak değil:

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 

Sonra sadece sarın senin gibi comma veya nocomma birinde Sexpr:

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

ise varsayılanı virgülle çevirmek istediğinizde prettyNum'u kullanmak için "# default" yorumlanmış satırı değiştirin. Her ne kadar bu sorunu çok fazla karıştırdığımı ve comma ve nocomma fonksiyonlarının dize formatını kendileri hesaplayabileceğini düşünmeme rağmen, o zaman bir kancaya ihtiyacınız olmaz.

Tam olarak sizin durumunuzu bilmeden, virgülle ayırma planına aykırı bir işlev yazabileceğimizi düşünmüyorum - örneğin, "2013 yılında 1342 vakanın" ilk numara commadine ihtiyaç duyduğunu bilmesi gerekir. ...

+0

Teşekkürler, @Spacedman. Bu, gönderdiğim soruyu yanıtlıyor ve yanıtlıyor, ben de kabul ediyorum. Gerçek kullanım durumumda, tarihlerimde olduğu gibi dizeler olarak saklanan bazı sayılarım var, ancak virgülle ayrılmış olmalarını istiyorum. Bu yüzden benim için 'is.numeric()' beni daha da yakınlaştırıyor, ama tam olarak değil. Kancayı çevrim içi olarak veya yığınla seçici olarak kapatmanın bir yolunu bulamadım. Siz ya da başkalarının bunu yapmanın bir yolunu düşünürse merak ediyorum. Şimdilik, 'is.numeric()' i kullanacağım ve benim durumumla uyumlu hale getirmek için başka işler yapacağım. –

+0

güzel ek. eğer (if (!, x, "nocomma")) iadesi için bir tane değiştirdiyse (prettyNum (x, big.mark = ",")) "sadece" nocomma() 'yi kullanmam gerekiyor Virgül varsayılanından sapmak istiyorum. –