我一直在使用一个很好的SO solution来为knitr报告中的数字添加逗号分隔一段时间,但是这个函数似乎有一个我以前从未遇到的意外结果:它用括号截断一个字符串。我不太了解类的使用,以了解为什么这个函数会影响我的字符串。这是一个简单的例子。
1)保持代码不变,逗号分隔工作(2,015
),但字符串被截断(30.2 (10
)。
2)删除钩子,你会看到相反的:没有逗号分隔(2015
)但是字符串没问题(30.2 (10.2)
)。
\documentclass{article}
\begin{document}
<<knitr, include=FALSE>>=
library(knitr)
nocomma <- function(x){structure(x,class="nocomma")}
knit_hooks$set(inline = function(x) {
if(!inherits(x,"nocomma")) return(prettyNum(x, big.mark=","))
if(inherits(x,"nocomma")) return(x)
return(x) # default
})
@
<<ex>>=
x <- paste0("30.2 ", "(", "10.2", ")")
x
# [1] "30.2 (10.2)"
y <- "2015"
@
The `nocomma()` function does a nice job putting a comma in \Sexpr{y}, but \Sexpr{x} gets truncated.
\end{document}
我喜欢钩子方法的是,所有需要000分离的内联字符串都会得到逗号而不必手动使用函数在整个文档的每个实例中设置逗号。这可能不是一个很好的解决方案,我对其他人开放。但它对我来说是一个非常实用的解决方案......直到今天,也就是说,它在我的文档中打破了其他内容:带有(
的字符串。
答案 0 :(得分:2)
您似乎并未按预期使用此功能。如果你看at the answer to the question you link to,它有两个实用功能:
comma <- function(x){structure(x,class="comma")}
nocomma <- function(x){structure(x,class="nocomma")}
功能定义略有不同:
knit_hooks$set(inline = function(x) {
if(inherits(x,"comma")) return(prettyNum(x, big.mark=","))
if(inherits(x,"nocomma")) return(x)
return(x) # default
})
使用comma("2015")
或nocomma(paste0("30.2 ", "(", "10.2", ")"))
的预期用例。
您的版本已被修改为始终尝试输入逗号,除非明确使用nocomma()
。你写道:
nocomma()
函数在逗号\Sexpr{y}
中做得很好,但\Sexpr{x}
被截断。
实际上,nocomma()
函数在您的示例中没有任何作用,因为您从不使用它。您可以使用---顾名思义,阻止逗号 - 就像这样:
自动在
\Sexpr{y}
添加逗号,但使用nocomma()
不会添加逗号:\Sexpr{nocomma(x)}
。
如果您正在寻找更自动化的解决方案,那么当您 想要修改时,您无需指定nocomma()
可以尝试让函数猜得更好(就像我在评论中建议的那样):
knit_hooks$set(inline = function(x) {
if(is.na(as.numeric(x))) return(x)
if(!inherits(x,"nocomma")) return(prettyNum(x, big.mark=","))
return(x) # default
})
这将尝试强制输入数字。如果它没有得到NA
,那么它会尝试在其中加一个逗号,否则它会保持不变。就个人而言,我更愿意只修改数字而不是触摸字符:
knit_hooks$set(inline = function(x) {
if(!(is.numeric(x)) return(x)
if(!inherits(x,"nocomma")) return(prettyNum(x, big.mark=","))
return(x) # default
})
此版本仅尝试修改直接数字,因此2015
将获得逗号; <{1}}和"2015"
不会有逗号。