我在用:
Ubuntu 12.04 64 位,
R 3.0.2,
RStudio 0.98.312,
针织机 1.5,
Markdown 0.6.3,
mgcv1.7-27
我有一个包含多个代码块的 Rmarkdown 文档。在一个 block 的中间有一些代码,我适合 GAM,总结适合度并绘制适合度。问题是第一个图渲染到输出文件中,但第二个图没有。这是来自该 block 的经过清理的代码片段:
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)])
一切都按预期呈现,除了输出直接从回显第二个绘图语句到回显下面的均值计算。均值计算的结果正确呈现。
如果我稍后在 block 中注释掉另一个绘图调用 7 行,则丢失的绘图将正确呈现。
有人对这里发生的事情有任何建议吗?
下面更新
总结 - 在调用 Plot 2 之后的几行,有一些 R 代码会生成执行错误(未找到变量),之后几行调用 Plot 3。如果代码错误得到修复,则渲染 Plot 2。如果代码错误未修复并且对 Plot 3 的调用被注释掉,则渲染 Plot 2。问题取决于用于存储不同拟合结果的相同变量“拟合”。如果我将每个拟合分配给不同的变量 Plot 2 呈现 OK。
我不明白在成功执行多行代码后所做的更改如何(显然是回顾性地)阻止 Plot 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
现在,但它不会暴露给 R,除非你分离 j0
并重新连接它。换句话说,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/