我正在尝试修改情节钩子。但是,行为是出于某种原因,取决于我是在编译文件中还是在此之前进行此修改。我想在那之前做(更多文件)。
最小例子:
```{r test}
print("this is test")
plot(1:10)
```
通过这个钩修改:
```{r setting, echo=FALSE}
plot_hook = knit_hooks$get("plot")
new_plot_hook = function(x, options){
x = paste0("{random-change}", x)
plot_hook(x, options)
}
knit_hooks$set(plot=new_plot_hook)
```
如果在文件中设置,则在代码块之前,它将编译为:
```r
print("this is test")
```
```
## [1] "this is test"
```
```r
plot(1:10)
```
![plot of chunk test]({random-change}figure/test-1.png)
但是,当我在运行knit之前进行修改时,我得到:
print("this is test")## [1] "this is test"
plot(1:10){random-change}figure/test-1.pdf
为什么呢?出了什么问题?为什么knitr在文件编译之前不会让我修改钩子?怎么解决?
编辑:我可能找到了答案: Trying to set Knitr 'document' output hook results in code chunk line breaks being lost
所以我首先需要调用render_markdown()
来加载markdown chunk设置,这显着改变了knit_hooks $ get(“plot”)中的代码。然后我可以运行我的代码并用所需的输出编织我的Rmakrdown。
然而,我知道如何,但我仍然不知道为什么。 Yihui在链接答案中提到,那个钩子应该只在文件里面设置。我的理论是,在调用knit时,knitr检测文件类型,因此需要模式类型并为该特定格式设置挂钩。但是,如果我在调用knit之前更改它,那就不行了。