我在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,但我不想分开几年。
答案 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
包裹在comma
或nocomma
中,如:
The hook will separate \Sexpr{comma(wantcomma)} and \Sexpr{nocomma(nocomma1)}, but I don't want to separate years.
如果您希望默认设置为commaify,请更改注释的行&#34; #default&#34;使用prettyNum
。虽然我认为我过于复杂,但comma
和nocomma
函数本身只能计算字符串格式,然后根本不需要钩子。< / p>
如果不完全了解您的情况,我不认为我们可以编写推断逗号方案的函数 - 例如,它必须知道2013年的#13; 1342个案例&#34;需要它的第一个数字commad而不是它的第二个......