knitr hook将000分开,但多年没有

时间:2014-10-15 12:22:31

标签: r knitr

我在rnw的顶部定义一个钩子,用逗号分隔&#; 000;

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

然而,有些数字我不想像这样格式化,例如几年。在下面的示例中打印\Sexpr{nocomma}时,是否有更好的方法来编写挂钩或覆盖挂钩的方法?

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

输出:

  

钩子将分开6,170和2月1日,2,014,但我不想分开几年。

1 个答案:

答案 0 :(得分:6)

如果您不想要以逗号分隔的唯一内容是字符串,请使用以下内容:

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

适用于您的日历字符串。但是假设您想要自己打印一年的数字?好吧,如何使用上面的钩子并转换为字符:

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

或可能(未经测试):

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

将标量转换为字符并节省一些输入。我们虽然不在这里打码高尔夫......

或者基于类的方法:

  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

然后将Sexpr包裹在commanocomma中,如:

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

如果您希望默认设置为commaify,请更改注释的行&#34; #default&#34;使用prettyNum。虽然我认为我过于复杂,但commanocomma函数本身只能计算字符串格式,然后根本不需要钩子。< / p>

如果不完全了解您的情况,我不认为我们可以编写推断逗号方案的函数 - 例如,它必须知道2013年的#13; 1342个案例&#34;需要它的第一个数字commad而不是它的第二个......