Sweave / knitr实现中mean和sem的函数

时间:2013-01-03 19:25:43

标签: r function latex sweave knitr

我正在集思广益,为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)。 我该如何解决这个问题。

1 个答案:

答案 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函数。