Knitr:显示内联代码块的源代码

Mar*_*zer 5 r knitr r-markdown

例如,在编写讲座幻灯片时,我们经常遇到一种情况,我们希望有一个内联代码输出source code = result.所以举个例子

"foofoofoo qt(p = 0.95, df = 24) = 1.710882 barbarbar"
Run Code Online (Sandbox Code Playgroud)

\Sexpr{qt(p = 0.95, df = 24)}只提供该输出的第二部分.一些解决方法之一是

\Sexpr{highr::hi_latex('qt(p = 0.95, df = 24)')} $=$ \Sexpr{qt(p = 0.95, df = 24)} 
Run Code Online (Sandbox Code Playgroud)

使用起来有点不舒服.

问题1:还有其他解决方案吗?

问题2:

内联钩子只允许我们改变评估结果的格式(所以1.710882应该如何显示上面的内容).

是否可以\Sexpr{}在内联钩子中将源代码作为选项提供?然后我可以轻松定义内联输出source = result.

Con*_*ncy 4

我想可以通过修改钩子来实现你想要的,但仅修改内联钩子是不够的,因为传递给内联钩子的唯一参数已经是评估结果而没有任何其他参数。而且修改很多hook风险太大,不值得。这里有一些可以轻松实现您想要的东西。例如,您可以s在 knitr 设置块中定义以下函数:

s <- function(x){
    paste0(deparse(substitute(x)), " = ", x)
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用类似r s(qt(p = 0.95, df = 24))或 的东西\Sexpr{s(qt(p = 0.95, df = 24))}来得到你想要的结果。

编辑:更复杂的方法可能是:

s <- function(x){
    paste0(deparse(substitute(x)), " = ", knitr::knit_hooks$get("inline")(x))
}
Run Code Online (Sandbox Code Playgroud)

这个版本s将提供您的舍入数字结果,就像默认的内联挂钩一样。

编辑:感谢@user2554330,我改为deparse(sys.call()[[2]]遵循deparse(substitute(x))更常见的 R 习惯用法。