我有一点问题编程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}

enter image description here

代码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))
  }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top