7

我在为 Sweave 编程 R 时遇到了一些问题,而#rstats twitter 组经常指向这里,所以我想我应该把这个问题交给 SO 人群。我是一名分析师——不是程序员——所以在我的第一篇文章中轻松一点。

问题出在:我正在用 R 在 Sweave 中起草一份调查报告,并希望使用\Sexpr{}. 例如,而不是说:

只有 14% 的受访者表示“X”。

我想这样写报告:

只有 \Sexpr{p.mean(variable)}$\%$ 的受访者说“X”。

问题是 Sweave 将表达式 in 的结果转换为\Sexpr{}字符串,这意味着 R 中表达式的输出与我文档中出现的输出不同。例如,上面我使用了函数'p.mean':

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 打印的内容,而不是作为表达式结果并最终打印在 LaTeX 文件中的字符转换。

as.character(p.mean(variable))  
>[1] 14  
>[1] "13.5857142857143"  

有谁知道我可以通过重新编程 R 函数或使用 Sweave 中的设置来限制 LaTeX 文件中打印的数字\Sexpr{}

4

5 回答 5

4

@KennyTM 明白了。@David,您应该避免,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()......你有所有的位,现在把它们放在一起。

附言

我不确定您的功能是如何工作的……我在分析中从未使用过加权平均值。最让我困惑的一点是weight=weight。在函数中多放一个参数不是更好吗?坦率地说,我仍然对你的函数给你正确的结果感到惊讶......可能是因为你weight在函数定义之前定义了变量。[编辑]如果您没有预定义函数,您将不会weight获得函数的加权平均值,而是“常规”平均值!

我希望这个对你有帮助!

亲切的问候, 亚历山大

于 2010-03-21T08:11:37.320 回答
3

尝试“格式”:

options(digits=1)

进而:

\Sexpr{format(p.mean(variable))}

您还可以使用“nsmall”参数:

options(digits=3)
...
\Sexpr{format(sqrt(2)-0.41,nsmall=2)}

如果你熟悉 C,你也可以尝试 'sprintf'。

于 2010-03-21T07:03:12.577 回答
2
as.character(round(p.mean(variable)))

?

于 2010-03-21T06:14:03.273 回答
1

sprintf() 函数非常适合格式化数字输出。

于 2010-03-25T00:10:06.847 回答
0

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)设置选项时会四舍五入。但是,如果您想在不同的地方进行不同的舍入,则需要对其进行调整,因为在 knitr 中的 \Sexpr 中不需要双重转义反斜杠。

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))
  }
}
于 2017-12-31T09:42:52.140 回答