内联 R 表达式返回错误的值

7
如果Rmd文件中的R代码重用相同的变量名,则内联R表达式似乎会返回该变量的最后一个值,而不考虑内联表达式的位置。除了确保在文档的不同部分不重用相同的变量名称之外,是否有避免这种行为的方法?
可重现的示例
---
title: "R Notebook"
output: html_notebook
---


```{r}
df <- cars
nrow(df)
```

The dataset has `r nrow(df)` rows.


```{r}
df <- iris
nrow(df)
```

The dataset has `r nrow(df)` rows.

这将产生以下输出:

enter image description here

我正在使用: R版本3.3.2(2016-10-31) 平台:x86_64-w64-mingw32 / x64(64位) 运行环境:Windows 7 x64(版本7601)Service Pack 1
rmarkdown_1.4 knitr_1.15.1

对我来说,在Win 7,R 3.3.2,rmarkdown 1.3,knitr 1.15.1上,在R Notebook和R Markdown中都按预期工作。 - m-dz
2个回答

3

问题在于,在您的页眉中,您正在"预览"您的文件,这实际上并未从头开始运行您的代码。您必须将它编织为HTML以使其运行,以便您的内联代码正确。

问题页眉

---
title: "R Notebook"
output: html_notebook
---

解决方案标题

---
title: "R Notebook"
output: 
    html_document: default
    html_notebook: default
---

其他注释

前面的解决方案存在两个问题。首先,根据RMarkdown文档,“内嵌表达式不接受knitr选项”(请参见http://rmarkdown.rstudio.com/lesson-4.html)。

其次,前一个答案的YAML格式不正确,迫使RStudio实际上编织文件。正确的格式化将生成您遇到的相同问题。

---
title: "R Notebook"
output: 
    html_notebook: default
---

1
这确实解决了问题!!!现在我也明白为什么了。不过我在想,这是否是R笔记本实现中的一个错误,因为“问题标题”是RStudio在打开新的R笔记本时定义的默认标题模板。(文件 -> 新建文件 -> R笔记本)。 - Sasha
没错。运行Ctrl+Shift+K并不能真正地编织文档,它只是预览而已。然而,如果你更改了选项中的“预览笔记本”为“编织为HTML”,那么它将更改标题并完成你想要的操作。之后,使用Ctrl+Shift+K(如果您使用键盘快捷键)就可以了。 - Mallick Hossain
顺便提一下,我刚刚注意到,如果按照你提议的方式编织HTML,输出结果就没有R笔记本输出那样好的功能,比如在HTML中以交互方式隐藏或显示代码。因此,尽管这是解决原始问题的方法,但可能并不完美。有什么想法可以启用相同的HTML功能,例如隐藏代码并仍然具有正确的内联表达式? - Sasha
只需在文件顶部添加html_document:folding:show即可。请参阅http://rmarkdown.rstudio.com/html_document_format.html。 - Mallick Hossain

2

起初,我们可以指定cache = TRUE

---
title: "R Notebook"

output: 
html_notebook: default


---

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


```{r}
df <- cars
nrow(df)
```

enter image description here


这对我不起作用。在两种情况下仍然得到相同的150行...我错过了什么? - Sasha
我正在使用相同的版本。这是我的sessionInfo.R版本3.3.2(2016-10-31) 平台:x86_64-w64-mingw32 / x64(64位) 运行在:Windows 7 x64(build 7601)Service Pack 1语言环境: [1] LC_COLLATE = English_United States.1252 LC_CTYPE = English_United States.1252 LC_MONETARY = English_United States.1252 LC_NUMERIC = C [5] LC_TIME = English_United States.1252附加基本包: [1] stats graphics grDevices utils datasets methods base其他附加包: [1] knitr_1.15.1 - Sasha
@Sasha 这是基于sessionInfo的软件包 [1] rmarkdown_1.4 knitr_1.15.1 RevoUtilsMath_10.0.0 RevoUtils_10.0.2 RevoMods_10.0.0 [6] MicrosoftML_1.0.0 mrsdeploy_1.0 RevoScaleR_9.0.1 lattice_0.20-34 rpart_4.1-10 - akrun
1
也许您想使用RMarkdown文档而不是R Notebook。 - student
2
另外,我建议您为这两个块使用不同的变量名称并重新执行它们。 - student
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接