KnitR HTML输出显示错误/奇怪的结果。内联代码和修改选项不会产生正确的输出

时间:2017-01-07 15:45:33

标签: r knitr

我正在创建一份关于几种分布的统计分析的报告;更具体地说是随机种群以及它们的样本与它们的不同之处,后者遵循正态分布的特性,而大多数情况下其较大的种群仍然存在偏差。

虽然我对输出的其余部分非常满意,但我无法弄清楚为什么某些数值及其可视化与通过命令行完成的不同。这里是一些重现的差异代码(首先我生成1000个随机指数):

set.seed(1000)
pop <- rexp(1000, 0.2)

在提取,pop的平均值时,我通过控制台得到了完全正确的结果,即4.76475。这是我应该通过降价输出获得的值,而是knitr将其显示为5.015616。

mean(pop)
[1] 4.76475

```{r, echo = T}
mean(pop)
```
[1] 5.015616

它不仅仅是平均值,而且几乎所有其他所需的统计变量都适用于人口和样本。另外,我在针织输出中也得到错误的可视化:

Original/correct plot

Knitted plot

由于结果不正确,图表本身显示不一致。我认为digits设置存在问题,但digits(options)并未解决问题,默认scipen = 0设置也未解决。我已经尝试插入内联代码,但它仍然向我显示不正确的值。如果缺少块设置但在那里找不到故障,请参考knitR的手册。这里是否有遗漏或与随机分布有关的错误?

编辑:我注意到了另一个奇特的财产。我创建了一个新的markdown文件,以查看结果是否根据我创建的每个新输出而变化。我们将其命名为test.Rmd,但它包含我在此处使用相同种子重现的相同命令。而且我现在得到一个完全不同的结果,仍然与命令会话中的原始值不同。

编辑:罗马的观点似乎正在发挥作用。针织结果更接近原始值,但仍然不完全匹配。设置为357的种子给了mean(pop) 4.881604,距离原始值只有小数点。但是为什么种子在这里改变游戏规则呢?我以为它必须是1000。

编辑:这是Phil。

要求的.Rmd文件中的一些代码
# Load packages
library(ggplot2)
library(knitr)
library(gridExtra)

# Generate random exponentials
set.seed(357)
pop = rexp(1000,0.2) # lambs is 0.2 with n = 1000
pop.table <- as.data.frame(pop)

# Take a sample simulating 1000 averages of 40 exponentials
sample.exp = NULL
for (i in 1:1000){
     sample.exp = c(sample, rexp(40, 0.2)} # n = 40 here
     sample.df <- as.data.frame(sample.exp)

# Generate means and compare
mean(pop) # 4.881604
mean(sample.exp) # 4.992426

# Generate variances and compare
var(pop) # 26.07005
var(sample.exp) # 0.6562298

# Some plots
plot.means.pop <- ggplot(pop.table, aes(pop.table$pop)) + geom_histogram(binwidth = 0.9, fill = 'white', colour = 'black') + geom_vline(aes(xintercept = mean(pop.table$pop), colour = 'red')) + labs(title =  'Population Mean', x = 'Exponential', y = 'Frequency') + theme(legend.position = 'none') +theme(plot.title = element_text(hjust = 0.5))

plot.means.sample <- ggplot(sample.df, aes(sample.df$sample.exp)) + geom_histogram(binwidth = 0.2, fill = 'white', colour = 'black') + geom_vline(aes(xintercept = mean(sample.df$sample.exp)), colour = 'red', size = 0.8) + labs(title = 'Sample Mean', x = 'Exponential', y = 'Frequency') + guides(fill = F) + theme(plot.title = element_text(hjust = 0.5))

grid.arrange(plot.means.sample, plot.means.pop, ncol = 2, nrow = 1)

这就是文件的主要部分,即使没有错误或命令行的确切结果,也会给我“接近”值。注意:在将种子设置为357之后,注释的值是 new 值,并且我为全局环境设置了相同的值。我在控制台收到的值是:

  • 人口平均值4.76475
  • 5.00238表示样本
  • 21.80913 for population variance
  • 0.6492991,样本差异

1 个答案:

答案 0 :(得分:1)

在Stack Overflow上提出问题时,必要提供 minimal reproducible example 。特别要好好阅读first answerthis advice,这将指导您完成整个过程。

我认为我们都努力帮助你(而且我们想要!)因为我们无法重现你的问题。分别在运行或编织时比较以下RRmd代码:

# Generate random exponentials
set.seed(1000)
pop = rexp(1000, 0.2) # lambs is 0.2 with n = 1000
mean(pop)
## [1] 5.015616
var(pop)
## [1] 26.07005

Rmd

---
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(
    echo = TRUE,
    message = TRUE,
    warning = TRUE
)
```

```{r}
# Generate random exponentials
set.seed(1000)
pop = rexp(1000, 0.2) # lambs is 0.2 with n = 1000
mean(pop)
var(pop)
```

产生以下输出:

  

# Generate random exponentials
  set.seed(1000)
  pop = rexp(1000, 0.2) # lambs is 0.2 with n = 1000
  mean(pop)
  ## [1] 5.015616
  var(pop)
  ## [1] 26.07005

正如您所看到的,结果与干净的R会话和干净的knitr会话完全相同。这是预期的,因为set.seed()设置相同时,每次应该提供相同的结果(请参阅set.seed手册页)。当您将种子更改为357时,结果会一起变化:

              | mean    | var      |
console (`R`) | 4.88... | 22.88... |
knitr (`Rmd`) | 4.88... | 22.88... |

在你的第二个代码块中你的knitr块结果对于1000种子是正确的,但4.76的控制台结果是不正确的,建议我 console 产生不正确的输出。这可能是出于以下几个原因之一:

  • 在运行rexp()功能之前,您忘记在控制台中设置种子。如果在不设置种子的情况下运行此行,结果每次都会变化。确保首先运行set.seed(1000)或使用R脚本并获取此脚本以确保按顺序运行步骤。
  • 您的全球R环境中的某些内容会影响您的结果。这不太可能是因为您清除了R环境,但这是通过关闭和重新打开RStudio或按CTRL +来不时创建新会话非常重要的原因之一Shift + F10
  • 您的RProfile.site.Rprofile可能会设置一些在启动时设置选项会影响您的搜索结果的内容。查看Customizing startup以打开并检查您的启动选项,并在必要时更正它们。

由于scipen因为科学/工程符号中没有数字,因此您看到的输出不是digits,因为您与<{1}}之间存在差异#39;重新看到的不仅仅是四舍五入的差异。

如果这些建议仍然无法解决您的问题,请发布最小的可重复示例并尝试使用其他计算机。