我在用:
Ubuntu 12.04 64位,
R 3.0.2,
RStudio 0.98.312,
针织物1.5,
Markdown 0.6.3,
mgcv1.​​7-27

我有一个带有多个代码块的Rmarkdown文档。在一个块的中间,有一些代码适合我的GAM,总结了适合度并绘制了适合度。问题在于第一个绘图渲染到输出文件中,而第二个绘图没有渲染到输出文件中。这是块中经过清理的代码片段:

fit <- gam(y ~ s(x), data=j0, subset= !is.na(x))
summary(fit) # look at non-missing only
plot(fit)

fit <- gam(y ~ s(sqrt(x)), data=j0, subset= !is.na(x))
summary(fit)
plot(fit)

mean(y[is.na(x)]) - mean(y[!is.na(x)])

一切都按预期进行渲染,除了输出从直接回显第二个图语句到直接对均值进行以下计算之外。均值计算的结果正确呈现。

如果我注释掉块中稍后7行的另一个绘图,则正确绘制了丢失的绘图。

有人对这里发生的事情有任何建议吗?

更新如下

简介-调用Plot 2后有几行,有一些R代码会生成执行错误(未找到变量),调用Plot 3后有几行,如果代码错误已解决,则呈现Plot 2。如果未解决代码错误,并且注释了对图3的调用,则呈现图2。问题取决于用于存储不同拟合结果的相同变量“拟合”。如果我将每个拟合分配给不同的变量,则图2会显示OK。

我不明白在成功执行多行代码后所做的更改如何(显然是追溯性的)如何阻止了情节2的呈现。

可重现的示例:
Some text.

```{r setup}
require(mgcv)

mkdata <- function(n=100) {
  x <- rnorm(n) + 5
  y <- x + 0.3 * rnorm(n)
  x[sample(ceiling(n/2), ceiling(n/10))] <- NA
  x <- x^2
  data.frame(x, y)
}
```

Example 1
=========

Plot 2 fails to render. (Using the same fit object for each fit.)

```{r example_1}
j0 <- mkdata()
attach(j0)
mx <- min(x, na.rm=TRUE)

fit <- gam(y ~ s(x), data=j0, subset= !is.na(x))
summary(fit)
plot(fit) # plot 1

fit <- gam(y ~ s(sqrt(x)), data=j0, subset= !is.na(x))
summary(fit)
plot(fit) #plot 2

mean(y[is.na(x)]) - mean(y[!is.na(x)]) # means calculation

# recode the missing values
j0$x.na <- is.na(x)
j0$x.c <- ifelse(x.na, mx, x) # ERROR in recode
detach()

attach(j0)
fit <- gam(y ~ s(sqrt(x.c)) + x.na, data=j0) # doesn't run because of error in recode
summary(fit) # this is actually fit 2
plot(fit) # plot 3 (this is actually fit 2)
detach()
```

Example 2
=========

Use separate fit objects for each fit. Plot 2 renders OK.

```{r example_2}
j0 <- mkdata()
attach(j0)
mx <- min(x, na.rm=TRUE)

fit1 <- gam(y ~ s(x), data=j0, subset= !is.na(x))
summary(fit1)
plot(fit1) # plot 1

fit2 <- gam(y ~ s(sqrt(x)), data=j0, subset= !is.na(x))
summary(fit2)
plot(fit2) #plot 2

mean(y[is.na(x)]) - mean(y[!is.na(x)]) # means calculation

# recode the missing values
j0$x.na <- is.na(x)
j0$x.c <- ifelse(x.na, mx, x) # ERROR in recode
detach()

attach(j0)
fit3 <- gam(y ~ s(sqrt(x.c)) + x.na, data=j0) # doesn't run because of error in recode
summary(fit3)
plot(fit3) # plot 3
detach()
```

Example 3
=========

Revert to using the same fit object for each fit. Plot 2 renders because plot 3 is commented out.

```{r example_3}
j0 <- mkdata()
attach(j0)
mx <- min(x, na.rm=TRUE)

fit <- gam(y ~ s(x), data=j0, subset= !is.na(x))
summary(fit)
plot(fit) # plot 1

fit <- gam(y ~ s(sqrt(x)), data=j0, subset= !is.na(x))
summary(fit)
plot(fit) #plot 2

mean(y[is.na(x)]) - mean(y[!is.na(x)]) # means calculation

# recode the missing values
j0$x.na <- is.na(x)
j0$x.c <- ifelse(x.na, mx, x) # ERROR in recode
detach()

attach(j0)
fit <- gam(y ~ s(sqrt(x.c)) + x.na, data=j0)
summary(fit) # this is actually fit 2
# plot(fit) # plot 3 (this is actually fit 2)
detach()
```

Example 4
=========

Plot 2 renders because later recode error is fixed.

```{r example_4}
j0 <- mkdata()
attach(j0)
mx <- min(x, na.rm=TRUE)

fit <- gam(y ~ s(x), data=j0, subset= !is.na(x))
summary(fit)
plot(fit) # plot 1

fit <- gam(y ~ s(sqrt(x)), data=j0, subset= !is.na(x))
summary(fit)
plot(fit) #plot 2

mean(y[is.na(x)]) - mean(y[!is.na(x)]) # means calculation

# recode the missing values
j0$x.na <- is.na(x)
j0$x.c <- ifelse(j0$x.na, mx, x) # error in recode fixed
detach()

attach(j0)
fit <- gam(y ~ s(sqrt(x.c)) + x.na, data=j0)
summary(fit)
plot(fit) # plot 3
detach()
```

日志文件:
> require(knitr); knit('reproduce.Rmd', encoding='UTF-8');
Loading required package: knitr


processing file: reproduce.Rmd
  |......                                                           |   9%
  ordinary text without R code

  |............                                                     |  18%
label: setup
  |..................                                               |  27%
  ordinary text without R code

  |........................                                         |  36%
label: example_1
  |..............................                                   |  45%
  ordinary text without R code

  |...................................                              |  55%
label: example_2
  |.........................................                        |  64%
  ordinary text without R code

  |...............................................                  |  73%
label: example_3
  |.....................................................            |  82%
  ordinary text without R code

  |...........................................................      |  91%
label: example_4
  |.................................................................| 100%
  ordinary text without R code


output file: reproduce.md

[1] "reproduce.md"

最佳答案

尽管人们一直在警告不要使用attach(),但您仍然是attach()的另一个受害者。用attach()搞砸太容易了。您在attach(j0)之后执行了此操作:

j0$x.na <- is.na(x)
j0$x.c <- ifelse(x.na, mx, x) # ERROR in recode

当然,R无法找到对象x.na,因为它在任何地方都不存在。是的,它现在在j0中,但是除非您分离j0并重新附加它,否则它不会暴露在R中。换句话说,当您向attach()中添加更多变量时,j0不会自动刷新自身。因此,简单的解决方法是:
j0$x.c <- ifelse(j0$x.na, mx, x)

我了解您为什么要使用attach()的原因-您可以在任何地方避免使用笨拙的j0$前缀,但是您需要非常小心。除了我提到的问题之外,detach()也是不好的,因为您没有指定要分离的环境,并且默认情况下,搜索路径上的第二个环境是分离的,不一定是您附加的环境,例如您可能已将其他软件包加载到搜索路径上。因此,您必须明确:detach('j0')

返回knitr:如果您想知道,我可以解释发生了什么,但是首先,您必须先确保代码确实有效,然后再将其传递给knitr。随着错误的消除,您观察到的奇怪现象也将消失。

关于r - 一些图未在Rstudio,knitr,Rmarkdown中渲染,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19286051/

10-13 03:13