编程R/Sweave适当\Sexpr输出
题
我有一点问题编程R Sweave,并#rstats twitter集团常常指在这里,所以我想我会把这个问题的所的人群。我的分析师-不是一个程序员--这样下去很容易对我的第一个员额。
这里的问题:我起草一份调查报告在Sweave R并希望报告中的边际返回的在线使用 \Sexpr{}
.例如,而不是在说:
只有14%的受访者说'X'。
我想写的报告是这样的:
只\Sexpr{p.意思是(变量)}$\%$的受访者说'X'。
问题是,Sweave转换的结果表达 \Sexpr{}
一个字符串中,这意味着输出从表达R和输出,出现在我的文件是不同的。例如,上面我使用能'p.意思是:
p.mean<- function (x) {options(digits=1) mmm<-weighted.mean(x, weight=weight, na.rm=T) print(100*mmm) }
在R,输出这样的:
p.mean(variable) >14
但是,当我使用 \Sexpr{p.mean(variable)}
, 我得到一个未四舍五入字符串中(在这种情况下:13.5857142857143)在我的文件。我试图限制输出我的功能 digits=1
在全球环境中,在功能本身,并且在各种命令。它似乎只包含什么R印刷品,而不是角色的转变,这是由的表达并最终打印的乳胶的文件。
as.character(p.mean(variable)) >[1] 14 >[1] "13.5857142857143"
任何人都不会知道我能做些什么来限制数字印在乳的文件,无论是通过重新编程R功能或与一个设在Sweave或 \Sexpr{}
?
解决方案
@KennyTM得到了它。@大卫,你应该避免的 options(digits = 1)
因为它会影响到所有的你的计算(它将抑制小数在每个输出之后).因此,使用 round()
功能后应用 weighted.mean()
.事情是这样的:
\Sexpr{round(p.mean(x))}
和 不不 使用 print()
, 但 return()
.这里就是为什么:
> set.seed(1234)
> x <- rnorm(100)
> foo <- function(x) {
res <- mean(x) + 5
print(res)
}
> foo(x)
[1] 5
> foo(x) + 10
[1] 5
[1] 15
使用 return()
或只是种类型的导致变量在最后一行:
> bar <- function(x) {
res <- mean(x) + 5
return(res)
}
> bar(x) + 10
[1] 15
因此,重写你的功能,并确保使用 as.character()
...你拥有所有的位,现在只是把它放在一起。
P.S.
我不知道你如何工作...我从来没有使用重的意思是在我的分析。位,这是令人费解的我的最多是 weight=weight
.那岂不是更好的投入多了一个参数的功能?坦率地说,我仍然感到惊讶的事实,你的功能是给你结果...可能是因为你有 weight
变量的定义的现有功能的定义。 [编辑] 你的 将不会 获得的加权平均你的功能如果你没有 weight
功能预定义,但"规则"的意思!
我希望这个人帮助你!
亲切的问候, Aleksandar
其他提示
试试格式':
options(digits=1)
然后:
\Sexpr{format(p.mean(variable))}
你也可以使用'nsmall'的说法:
options(digits=3)
...
\Sexpr{format(sqrt(2)-0.41,nsmall=2)}
你也可以尝试'sprintf'如果你熟悉C。
as.character(round(p.mean(variable)))
?
该sprintf()function是伟大的格式化数字输出。
的 siunitx 包也可以用数字格式,在sweave.
代码Sweave
以下脚本显示如何使用它以数字格式、语法是 Sweave.在序言部分,你可以你喜欢的格式
\sisetup{
round-mode = figures,
round-precision = 3
}
然后替代它的命令 \Sexpr{num(pi,round_precision=2)}
\documentclass[a4paper]{article}
\usepackage{siunitx}
\usepackage{Sweave}
\title{siunitx}
\sisetup{
round-mode = figures,
round-precision = 3
}
\begin{document}
\maketitle
<<sanitize_number,echo=FALSE>>=
num <- function(x,round_precision=NULL)
{
if (is.null(round_precision)) {
return(sprintf("\\\\num{%s}", x))
} else {
return(sprintf("\\\\num[round-precision=%s]{%s}",round_precision, x))
}
}
@
Examples :\\
round\_precision= 2 gives : \Sexpr{num(pi,round_precision=2)} \\
round\_precision= 4 gives : \Sexpr{num(pi,round_precision=4)}\\
Default formatting gives : \Sexpr{num(pi)}
\end{document}
代码knitr
在knitr默认情况下,数字\Sexpr是圆的当选项 options(digits = 2)
被设定。但如果你想要不同的四舍五入,在不同的地方,以下代码的工作,它需要适应,因为没有需要双逃antislashes中\Sexpr在knitr.
num <- function(x,round_precision=NULL)
{
if (is.null(round_precision)) {
return(sprintf("\\num{%s}", x))
} else {
return(sprintf("\\num[round-precision=%s]{%s}",round_precision, x))
}
}