来自 赵鹏 | September 22, 2017
其实本文的标题应该是:如何在文章里显示 `r pi`
这样的文字。但是我不知道怎么把这个格式弄到标题里。所以,就这样凑合过吧。
这个问题的答案,要分几层意思来说。`r pi`
是代码格式(本博客显示为粉底红字),并且包含的`符号同样是代码格式,并且 pi 并没有被编译成 3.1415927。别看它短,这三点每个都是个坑。
这个问题在编写 R markdown 教程时常见。其实,等你明白这个问题的答案后,会发现答案并不难,难的是如何描述这个问题。我费了好大劲,都想不出一个准确描述的办法,并且在那些支持 markdown 的论坛上,我连这个小撇都输不出来,这叫人怎么问?最后我只能这么提问:
请问在输出文档里怎么显示’撇 r pi 撇’并且别让它编译出来 3.1415927?
第 1 层意思,那个小撇 `,它到底叫什么?总不能总叫“小撇”吧?
我用的是德语键盘,挪,就是上图第一行右起第二个键的上面那个小可爱。
查维基百科才知道,` 的学名叫 Grave accent ,中文叫“重音符”。在程序猿的世界里,它又被称作 backquote 或 backtick,中文叫反引号。所以,跟这个有关的问题可以这么问:
How do I escape a backtick ` in Markdown?
或者
How to display verbatim/literal inline r code with backticks using Rmarkdown?
第 2 层意思:怎么把反引号显示出来?
如果仅仅输入个反引号 ,在同一段里后面没有了还好办,万一又出现一个反引号
,就会把他俩自动配对儿,两者之间的文字当成了代码。瞧,就是上句话这个德性。
为了棒打鸳鸯不让他俩自动配对儿,那就用转义符\。输入\`,就避免反引号自动配对变代码了。
第 3 层意思,是怎么把 r 语言的输出结果显示到代码环境里。
这个就开始有点绕了。
比如,我想在Rmd 源文件里输入 pi,而输出的文档里显示 3.1415927
。注意,光是输出 3.1415927 这容易,输入`r pi`
就行了,但是怎么显示成代码格式(这里是粉底红字)?在 `r pi`
外边加一层反引号是不行的。
正确的方法是: 两个反引号
+ 一个空格
+ 一个反引号
+ r
+ pi
+ 一个反引号
+ 一个空格
+ 两个反引号
。
也就是说,两个反引号
+ 一个空格
相当于更外一层的反引号。 R markdown 先看到内层的反引号,进行编译,得到 3.1415927:然后,看到外层的反引号,于是把内层的编译结果表示成代码格式。
第 4 层意思,怎么让上面那个 3.1415927 在输出文档里显示源码’r pi’,并且都在代码环境(粉底红色)里,即 r pi
?
方法有两种。第一种是用knitr 的 inline_expr()
函数:`r knitr::inline_expr('pi')`
第二种是用第 3 层意思里说的方法,即 两个反引号
+ 一个空格
r
+ 一个空格
+ pi
+ 一个空格
+ 两个反引号
。
牢记两个反引号
+ 一个空格
= 更外一层的反引号
,就稍微容易理解一点。
写到这个地方,我已经要晕车了,但是还没完。
第 5 层意思,怎么在第 4 层意思的基础上再加两个反引号,并显示成粉底红字,即
`r pi`
我现在用的方法是:
`r '\x60r pi\x60'`
这个 \x60
就是反引号。相当于把反引号弄到字符串里处理。
完了吗?还没完,还有第 6 层意思。
反引号就像个俄罗斯套娃;上文你看到的结果都是渲染出来的,而实际书写的源文档,总会比你看见的外面再多一层。
写到这里,我不行了,容我扶墙出去呼吸两颗新鲜空气。