第12章输出挂钩(*)

使用针织物包中,您可以控制代码块的每一段输出,例如源代码、文本输出、消息和绘图。控制是通过“输出挂钩”实现的。输出挂钩是一系列函数,它们将一段输出作为输入(通常是字符向量),并返回要写入输出文档的字符向量。目前这可能不容易理解,但希望您可以通过下面的一个小示例更清楚地了解这个想法,该示例解释了如何通过针织物的输出挂钩。

用一行代码考虑这个代码块:

```{右}
1+1
```

之后针织物计算代码块,它得到两个输出元素,并且两者都存储为字符串:源代码"1 + 1",以及文本输出"[1] 2"。这些字符串将由块挂钩进一步处理,以获得所需的输出格式。例如,对于降价文档,针织物将把源代码包装在一个带有语言名称的隔离代码块中。这是通过来源钩子,它或多或少类似于此函数:

#对于上述情况,“x”是字符串“1”+
# 1'
功能(x,选项){
  #这里的小“r”表示语言名称
  粘贴(c(c)(“``r”,x,"```"),坍塌= "\n个")
}

类似地,文本输出由输出看起来像这个函数的钩子:

功能(x,选项){
  粘贴(c(c)(“```”,x,"```"),坍塌= "\n个")
}

因此,上述代码块的最终输出是:

```第页
1 + 1
```

```
[1] 2
```

实际的钩子比上面的两个函数更复杂,但其思想是相同的。您可以从对象中获得实际的钩子编织钩通过获取()方法,例如。,

#对于有意义的输出,下面的代码应该是
#在knitr文档的代码块内执行
针织物::编织钩$得到(“源”)
针织物::针织品_书籍$得到(“输出”)
#或knitr::knit_hooks$get(c('source','output'))

除非你真的有兴趣为针织物包中,我们不建议您阅读这些内置挂钩的源代码。如果您感兴趣,可以在表单中命名的脚本中找到此代码挂钩-*。R(右)https://github.com/yihui/knitr/tree/master/R网站(例如。,挂钩-md.R包含R Markdown文档的挂钩)。作为一个针织物用户,如果您知道如何利用内置挂钩创建自定义输出挂钩,通常就足够了。您将在本章的几个示例中了解到这一点,我们将在下面展示基本思想。

自定义输出挂钩通过设置()方法编织钩。因为此方法将覆盖现有的默认挂钩,所以我们建议您保存现有挂钩的副本,以自己的方式处理输出元素,并将结果传递给默认挂钩。通常的语法是:

#在这里使用local()是可选的(我们只想
#避免创建不必要的全局变量,如
#`hook_old`)
地方的({
挂钩(_O)<-针织物::针织品_书籍$得到(“名称”)#保存旧钩子
针织物::编织钩$设置(名称= 功能(x,选项){
    #现在对x做你想做的任何事情,然后通过
    #新x到旧hook
    挂钩(_O)(x,选项)
})
})

在这里,名称是挂钩的名称,可以是以下值之一:

  • 来源:正在处理源代码。

  • 输出:正在处理文本输出。

  • 警告:正在处理警告(通常来自警告())。

  • 消息:处理消息(通常来自消息())。

  • 错误:处理错误消息(通常来自停止())。

  • 情节:正在处理打印文件路径。

  • 内联:处理内联R表达式的输出。

  • :处理整个块的输出。

  • 文件:处理整个文档。

论点的含义x个钩子中的函数在上面的列表中进行了解释。对于选项参数,它表示当前代码块的块选项(作为列表)。例如,如果您设置foo=真在块上,可以通过以下方式获取其值选项$foo在钩子里。这个选项参数对不可用内联文件挂钩。

输出挂钩使您能够最终控制块和文档输出的每一块。与通常具有预定义用途的块选项相比,输出挂钩功能更强大,因为它们是用户定义的函数,您可以在函数中执行任何操作。