我正在集思广益,为Sweave / knitr使用写一个均值和sem函数。而对于我有限的知识,它看起来像这样
m.se <- function (x, na.rm = TRUE) {
if (na.rm)
x <- x[!is.na(x)]
n <- length(x)
if (n == 0)
return(c(mean = NA, sem = NA))
xbar <- sum(x)/n
se <- sqrt(sum((x - xbar)^2)/(n - 1))/sqrt(n)
c(mean = xbar, sem = se)
return(paste(xbar,"\\pm",se))
}
它确实做了一些工作,它给出了输出:
43.9303846153846 \pm 3.34823050767781
问题是它不尊重我在主环境中定义的option()
(knitr中的setup chunk)。
我该如何解决这个问题。
答案 0 :(得分:2)
您的平均值和标准差的代码不是最佳的。正如Dieter Menne所提到的,如果您不是为锻炼目的而这样做,则可以简单地使用内置的mean()
和sd()
。
knitr
软件包已经做了很多努力来更好地打印数字,我建议您使用这些工具而不是发明自己的格式规则。请参阅下面的解决方案(\Sexpr{}
将尊重options('digits')
):
\documentclass{article}
\begin{document}
<<mean-sem>>=
options(digits = 3)
m.se <- function (x, ...) {
n <- length(x)
if (n == 0) return(c(mean = NA, sem = NA))
se <- sd(x, ...)/sqrt(n)
c(mean = mean(x, ...), sem = se)
}
res <- m.se(rnorm(100))
@
What you want is $\Sexpr{res['mean']} \pm \Sexpr{res['sem']}$.
\end{document}
更重要的是,这是一个可移植的解决方案 - 如果你想要一个HTML版本,你只需编写<!--rinline res['mean']--> ± <!--rinline res['sem']-->
,而不必重新定义你的R函数。