编程R/Sweave以获得正确的\ Sexpr输出

deo*_*ksu 7 latex r pdflatex sweave

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

问题在于:我正在起草一份带有R的Sweave调查报告,并希望报告边际收益\Sexpr{}.例如,而不是说:

只有14%的受访者表示'X'.

我想写这样的报告:

只有\ Sexpr {p.mean(variable)} $ \%$的受访者表示'X'.

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

p.mean<- function (x) {options(digits=1)  
mmm<-weighted.mean(x, weight=weight, na.rm=T)  
print(100*mmm)  
}
Run Code Online (Sandbox Code Playgroud)

在R中,输出如下所示:

p.mean(variable)
>14
Run Code Online (Sandbox Code Playgroud)

但是当我使用时\Sexpr{p.mean(variable)},我的文档中会得到一个未连接的字符串(在本例中为13.5857142857143).我试图将函数的输出限制digits=1在全局环境,函数本身和各种命令中.它似乎只包含R打印,而不是表达式结果的字符转换,最终打印在LaTeX文件中.

as.character(p.mean(variable))  
>[1] 14  
>[1] "13.5857142857143"  
Run Code Online (Sandbox Code Playgroud)

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

aL3*_*3xa 4

@KennyTM 明白了。@David,你应该避免options(digits = 1),因为它会影响你的所有计算(它会在以后的每个输出中抑制小数)。因此,round()在应用weighted.mean(). 像这样的东西:

\Sexpr{round(p.mean(x))}
Run Code Online (Sandbox Code Playgroud)

并且使用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
Run Code Online (Sandbox Code Playgroud)

使用return()或仅在最后一行中键入结果变量:

> bar <- function(x) {
   res <- mean(x) + 5
   return(res)
}
> bar(x) + 10
[1] 15
Run Code Online (Sandbox Code Playgroud)

因此,重写您的函数,并确保使用as.character()...您拥有所有的位,现在只需将它们放在一起即可。

聚苯乙烯

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

我希望这个对你有帮助!

亲切的问候,亚历山大