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':
Run Code Online (Sandbox Code Playgroud)p.mean<- function (x) {options(digits=1) mmm<-weighted.mean(x, weight=weight, na.rm=T) print(100*mmm) }
在R中,输出如下所示:
Run Code Online (Sandbox Code Playgroud)p.mean(variable) >14
但是当我使用时\Sexpr{p.mean(variable)},我的文档中会得到一个未连接的字符串(在本例中为13.5857142857143).我试图将函数的输出限制digits=1在全局环境,函数本身和各种命令中.它似乎只包含R打印,而不是表达式结果的字符转换,最终打印在LaTeX文件中.
Run Code Online (Sandbox Code Playgroud)as.character(p.mean(variable)) >[1] 14 >[1] "13.5857142857143"
有谁知道我可以,或者通过重新编程R函数或与Sweave或设置做以限制LaTeX的文件打印的数字\Sexpr{}?
@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获得函数的加权平均值,而是“常规”平均值!
我希望这个对你有帮助!
亲切的问候,亚历山大