gpt4 book ai didi

r - 对 R/Sweave 进行编程以获得正确\Sexpr 输出

转载 作者:行者123 更新时间:2023-12-02 13:59:58 24 4
gpt4 key购买 nike

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

问题是:我正在使用 R 在 Sweave 中起草一份调查报告,并希望使用 \Sexpr{} 报告边际返回。例如,不要说:

Only 14% of respondents said 'X'.

我想这样写报告:

Only \Sexpr{p.mean(variable)}$\%$ of respondents said '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)
}

在 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 或 \Sexpr{} 中的设置来限制 LaTeX 文件中打印的数字?

最佳答案

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

\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 变量。 [编辑]如果您没有预定义权重函数,则您将无法获得函数的加权平均值,而是“常规”平均值!

希望这篇文章能帮到你!

亲切的问候,亚历山大

关于r - 对 R/Sweave 进行编程以获得正确\Sexpr 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2486130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com