Knitr asis不使用钩子的输出

时间:2014-07-19 22:54:57

标签: r templates latex knitr rnw

在Rnw / LaTeX中,使用knitr hooks的常见输出可能会在一些花哨的环境中装饰来自块的数据。
例如,特定于块的代码可以生成表的核心数据,并且在提供重复装饰之前和之后的钩子代码。

请考虑以下代码段:

\documentclass{article}
\begin{document}

<<myhooks,  include=FALSE>>=
printhook=function(before, options, envir) {
    if (before) {

        return('\nCommon R \\LaTeX\\ in before-hook')
    } else {
        return('\nCommon R \\LaTeX\\ in after-hook')
    }
}

knit_hooks$set(lprint = printhook)

@ 


<<test, results='asis', lprint=TRUE,  echo=FALSE>>=
cat("R \\LaTeX\\ in current chunk\n")
@ 

\end{document}

问题在于LaTeX输出大致如下:

   \begin{kframe}
   Common R \LaTeX\ in before-hook
   \end{kframe}

   R \LaTeX\ in current chunk

   \begin{kframe}
   Common R \LaTeX\ in after-hook
   \end{kframe}

钩子代码实际上不是 asis ,但是它被包裹在kframe环境中,这可以防止将这三个部分粘合在一起。

我们如何删除封闭的kframe

1 个答案:

答案 0 :(得分:2)

我没有这个问题的优雅解决方案。以下是一种可能的解决方案基本思想是在chunk时替换输出挂钩results == 'asis',不回显源代码,并且不会在代码块中生成绘图:

\documentclass{article}
\begin{document}

<<myhooks, include=FALSE>>=
local({
  hook_chunk = knit_hooks$get('chunk')
  knit_hooks$set(chunk = function(x, options) {
    x = hook_chunk(x, options)
    if (options$results == 'asis' && !options$echo && options$fig.num == 0) {
      # remove all kframe's
      gsub('\\\\(begin|end)\\{kframe\\}', '', x)
    } else x
  })
})
printhook=function(before, options, envir) {
    if (before) {
        return('\nCommon R \\LaTeX\\ in before-hook')
    } else {
        return('\nCommon R \\LaTeX\\ in after-hook')
    }
}
knit_hooks$set(lprint = printhook)
@

<<test, results='asis', lprint=TRUE,  echo=FALSE>>=
cat("R \\LaTeX\\ in current chunk\n")
@

\end{document}