相关文章推荐
潇洒的饼干  ·  2022网刃杯CTF - REVERSE ...·  11 月前    · 
聪明伶俐的人字拖  ·  [Solved] C# how to ...·  1 年前    · 
刚分手的椰子  ·  Range.BorderAround 方法 ...·  1 年前    · 
读研的红薯  ·  vue网格布局组件-掘金·  1 年前    · 
  • 44.2.1 cppFunction() 转换简单的C++函数—Fibnacci例子
  • 44.2.2 sourceCpp() 转换C++程序—正负交替迭代例子
  • 44.2.3 sourceCpp() 转换C++源文件中的程序—正负交替迭代例子
  • 44.2.4 sourceCpp() 转换C++源程序文件—卷积例子
  • 44.2.5 在Rmd文件中使用C++源程序文件
  • 45 R与C++的类型转换
  • 45.1 wrap() 把C++变量返回到R中
  • 45.2 as() 函数把R变量转换为C++类型
  • 45.3 as() wrap() 的隐含调用
  • 46 Rcpp 属性
  • 46.1 Rcpp属性介绍
  • 46.2 在C++源程序中指定要导出的C++函数
  • 46.3 在R中编译链接C++代码
  • 46.4 Rcpp属性的其它功能
  • 46.4.1 自变量有缺省值的函数
  • 46.4.2 允许用户中断
  • 46.4.3 把R代码写在C++源文件中
  • 46.4.4 在C++中调用R的随机数发生器
  • 47 Rcpp提供的C++数据类型
  • 47.1 RObject类
  • 47.2 IntegerVector类
  • 47.2.1 IntegerVector示例1:返回完全数
  • 47.2.2 IntegerVector示例2:输入整数向量
  • 47.3 NumericVector类
  • 47.3.1 示例1:计算元素 \(p\) 次方的和
  • 47.3.2 示例2: clone 函数
  • 47.3.3 示例3:向量子集
  • 47.4 NumericMatrix类
  • 47.4.1 示例1:计算矩阵各列模的最大值
  • 47.4.2 示例2:把输入矩阵制作副本计算元素平方根
  • 47.4.3 示例3:访问列子集
  • 47.5 Rcpp的其它向量类
  • 47.5.1 Rcpp的LogicalVector类
  • 47.5.2 Rcpp的CharacterVector类型
  • 47.6 Rcpp提供的其它数据类型
  • 47.6.1 Named类型
  • 47.6.2 List类型
  • 47.6.3 Rcpp的DataFrame类
  • 47.6.4 Rcpp的Function类
  • 47.6.5 Rcpp的Environment类
  • 48 Rcpp糖
  • 48.1 简单示例
  • 48.2 向量化的运算符
  • 48.2.1 向量化的四则运算
  • 48.2.2 向量化的二元逻辑运算
  • 48.2.3 向量化的一元运算符
  • 48.3 用Rcpp访问数学函数
  • 48.4 返回单一逻辑值的函数
  • 48.5 返回糖表达式的函数
  • 48.6 R与Rcpp不同语法示例
  • 49 用Rcpp帮助制作R扩展包
  • 49.1 不用扩展包共享C++代码的方法
  • 49.2 生成扩展包
  • 49.2.1 利用已有基于Rcpp属性的源程序制作扩展包
  • 49.2.2 DESCRIPTION文件
  • 49.2.3 NAMESPACE文件
  • 49.3 重新编译
  • 49.4 建立C++用的接口界面
  • 50 R编程例子
  • 50.1 R语言
  • 50.1.1 用向量作逆变换
  • 50.1.2 斐波那契数列计算
  • 50.1.3 穷举所有排列
  • 50.1.4 可重复分组方式穷举
  • 50.1.5 升降连计数
  • 50.1.6 高斯八皇后问题
  • 50.2 概率
  • 50.2.1 智者千虑必有一失
  • 50.2.2 圆桌夫妇座位问题
  • 50.3 科学计算
  • 50.3.1 城市间最短路径
  • 50.3.2 Daubechies小波函数计算
  • 50.3.3 房间加热温度变化
  • 50.4 统计计算
  • 50.4.1 线性回归实例
  • 50.4.2 核回归与核密度估计
  • 50.4.3 二维随机模拟积分
  • 50.4.4 潜周期估计
  • 50.4.5 ARMA(1,1)模型估计
  • 50.4.6 VAR模型平稳性
  • 50.4.7 贮存可靠性评估
  • 50.5 数据处理
  • 50.5.1 小题分题型分数汇总
  • 50.5.2 类别编号重排
  • 50.6 文本处理
  • 50.6.1 用R语言下载处理《红楼梦》htm文件
  • 51 使用经验
  • 51.1 文件管理
  • 51.1.1 文件备份
  • 51.1.2 工作空间
  • 51.2 程序格式
  • A R Markdown文件格式
  • A.1 R Markdown文件
  • A.2 R Markdown文件的编译
  • A.2.1 编译的实际过程
  • A.3 在R Markdown文件中插入R代码
  • A.4 输出表格
  • A.5 利用R程序插图
  • A.6 冗余输出控制
  • A.7 代码段选项
  • A.7.1 代码和文本输出结果格式
  • A.7.2 图形选项
  • A.7.3 缓存(cache)选项
  • A.8 章节目录链接问题
  • A.9 其它编程语言引擎
  • A.10 交互内容
  • A.11 属性设置
  • A.11.1 YAML元数据
  • A.11.2 输出格式
  • A.11.3 输出格式设置
  • A.11.4 目录设置
  • A.11.5 章节自动编号
  • A.11.6 Word输出章节自动编号及模板功能
  • A.11.7 HTML特有输出格式设置
  • A.11.8 关于数学公式支持的设置
  • A.11.9 输出设置文件
  • A.12 LaTeX和PDF输出
  • A.12.1 TinyTex的安装使用
  • A.12.2 Rmd中Latex设置
  • A.13 生成期刊文章
  • A.14 附录:经验与问题
  • A.14.1 Word模板制作
  • A.14.2 数学公式设置补充
  • B 用bookdown制作图书
  • B.1 介绍
  • B.2 一本书的设置
  • B.3 章节结构
  • B.4 书的编译
  • B.5 交叉引用
  • B.6 数学公式和公式编号
  • B.7 定理类编号
  • B.8 文献引用
  • B.9 插图
  • B.10 表格
  • B.10.1 Markdown表格
  • B.10.2 kable() 函数制作表格
  • B.10.3 R中其它制作表格的包
  • B.11 数学公式的设置
  • B.12 使用经验
  • B.12.1 学位论文
  • B.12.2 LaTeX
  • B.12.3 算法
  • B.12.4 中文乱码
  • B.12.5 图片格式
  • B.12.6 其它经验
  • B.13 bookdown的一些使用问题
  • C 用R Markdown制作简易网站
  • C.1 介绍
  • C.2 简易网站制作
  • C.2.1 网站结构
  • C.2.2 编译
  • C.2.3 内容文件
  • C.2.4 网站设置
  • C.3 用blogdown制作网站
  • C.3.1 生成新网站的框架
  • C.3.2 网页内容文件及其设置
  • C.3.3 初学者的工作流程
  • C.3.4 网站设置文件
  • C.3.5 静态文件
  • D 制作幻灯片
  • D.1 介绍
  • D.2 Slidy幻灯片
  • D.2.1 文件格式
  • D.2.2 幻灯片编译
  • D.2.3 播放控制
  • D.2.4 生成单页HTML
  • D.2.5 数学公式处理与输出设置文件
  • D.2.6 其它选项
  • D.2.7 slidy幻灯片激光笔失效问题的修改
  • D.3 MS PowerPoint幻灯片
  • D.4 Bearmer幻灯片格式
  • D.5 R Presentation格式
  • References
  • 编著:李东风
  • R的bookdown扩展包( https://github.com/rstudio/bookdown ) 是继knitr和rmarkdown扩展包之后, 另一个增强markdown格式的扩展, 使得Rmd格式可以支持公式、定理、图表自动编号和引用、链接, 文献引用和链接等适用于编写书籍的功能。 在bookdown的管理下一本书的内容可以分解成多个Rmd文件, 其中可以有可执行的R代码, R代码生成的文字结果、表格、图形可以自动插入到生成的内容中, 表格和图形可以是浮动排版的。 输出格式主要支持gitbook格式的网页图书, 这种图书在左侧显示目录, 右侧显示内容, 并可以自动链接到上一章和下一章; 通过单独安装的LaTeX编译器支持将书籍转换为一个PDF文件, 支持中文; 可以生成ePub等格式的电子书。

    主要用于编写有多个章节的书籍, 也可以用来生成单一文件的研究报告。

    建议使用RStudio集成环境制作这样的图书, 该软件内建了一键编译整本书的功能。 需要安装bookdown扩展包的最新版本。 bookdown扩展包现在还比较新, 还有一些BUG, 所以尽可能使用最新版的bookdown扩展包并且及时更新RStudio软件。 查看编译的网站建议使用Google Chrome浏览器, 此浏览器对gitbook的支持较好。

    为了新写一本书或者从已有的书转换, 最简单的做法是从bookdown的网站下载bookdown配套的例书的zip文件 (见 https://github.com/rstudio/bookdown-demo ), 将其解压到本地硬盘某个子目录, 然后修改其中的内容适应自己的书的需要。

    因为中文需要一些特殊的设置, 以及在网络条件不好的条件下支持数学公式显示, 本书作者提供了一个粗浅的中文书bookdown模板, 下载链接为:

  • bookdown-template-v0-6.zip
  • 其中的CBook子目录包含了所需的中文书模板, CArticle子目录包含了论文格式模板, 其它子目录有一些别的模板, 为了在本地支持网页中的数学公式显示还有一个MathJax目录。 参见其中的readme.txt说明文件。

    B.2 一本书的设置

    一本用bookdown管理的书, 一般放置在某个子目录下, 并作为一个RStudio项目(project)用RStudio管理。

    也可以自己新建一个目录, 然后编辑生成必要的文件。 注意,所有的文本文件都要使用UTF-8编码。 一本bookdown书, 一般都需要有一个 index.Rmd 文件, 这是最后生成的网站的主页的原始文件, 可以在这个文件中写一些书的说明, 并在开头的YAML元数据部分进行有关设置, 如标题、作者、日期等。 index.Rmd 的一个例子如下:

    除了 index.Rmd 文件, 项目中每个.Rmd文件都作为一章。 每个.Rmd文件第一行, 应该是以一个井号和空格开头的一级标题, 后面再加空格然后有大括号内以井号开头的章标签,

    建议使用RStudio软件编辑内容, 管理和编译整本书。

    index.Rmd 或者 _bookdown.yml 中设置 site: bookdown::bookdown_site 后, RStudio就能识别这个项目是一个bookdown项目, 这时RStudio会有一个Build窗格,其中有“Build book”快捷图标, 从下拉菜单中选择一个输出格式(包括gitbook、pdf_book、epub_book), 就可以编译整本书。 对gitbook格式, 即HTML网页格式, 编译完成后会弹出一个预览窗口, 其中的“Open in Browser”按钮可以将内容在操作系统默认的网络浏览器中打开。

    另一种办法是在命令窗口用如下命令编译(以输出gitbook为例), 我个人认为这种办法更好用:

    TinyTeX 软件, 安装和管理参见 A.12.1

    对于较短的书, 做了一定修改后都可以重新编译gitbook结果和pdf_book结果。 在书比较长了以后, 每次编译都花费很长时间, 所以可以仅编译gitbook格式的一章, 修改满意后再编译整本书。 仅编译一章也需要所有的.Rmd文件都是已经编译过一遍的, 新增的Rmd文件会使得编译单章出错, 每次新增了Rmd文件都应该重新编译整本书, 但是内容修改后不必要重新编译整本书, 可以仅编译单章。

    编译单章现在没有快捷图标, 只能在RStudio控制台(命令行)运行如下命令:

    在写作时,每个一级到三级标题都应该有自定义的标签, 格式是在标题行末尾空格后添加 {#label} , 其中label是自己指定的标签, 使用英文、数字、减号, 不要使用中文, 而且整本书不要有重复的标签。 为避免不同章节使用了重复标签, 可以取 label 的前一部分为所在章节的文件名。

    如果要引用某一章节, 有如下的做法:

  • §\@ref(label) label 是某个标题对应的标签。 结果显示为如 §3.1.1 这样的章节号,并可点击, 点击时跳跃到相应的章节。
  • [链接文本](#label) 其中 label 是某个标题对应的标签。 结果产生一个链接,显示为 链接文本 ,点击时跳到 label 对应的章节。
  • 有时需要在数学公式内部、图形的说明中引用定理编号、公式编号等, 这需要预先定义单独的文字性引用, 然后再使用该文字引用。 定义文字引用如:

    (ref:mytextlabel) 见定理\@ref(thm:orth)

    可以在数学公式内部、图形说明的字符串内用 (ref:mytextlabel) 的格式调用上面定义的文字引用。 目前在数学公式内部使用有BUG。

    B.6 数学公式和公式编号

    通过R的knitr和rmarkdown扩展包以及pandoc软件, .Rmd格式文件已经支持数学公式, 见 R Markdown说明

    在用 $$ 符号在两端界定的公式后面, 可以用 \tag{标号} 命令增加人为的公式编号,如

    y = f(x) \tag{*}

    结果显示为

    y = f(x) \tag{*}

    要注意的是, 在 $$ 界定的数学公式内用了aligned环境后, 仅能在 \end{aligned} 之后加 \tag{标号} 命令, 而不能写在aligned环境内。 多行的公式将不能为每行编号。

    \tag 命令人为编号比较简单易用, 但是在有大量公式需要编号时就很不方便, 只要增加了一个公式就需要人为地重新编号并修改相应的引用。 bookdown包支持对公式自动编号, 并可以按公式标签引用公式, 引用带有超链接。

    bookdown的自动编号对LaTeX的equation环境、align环境都可以使用, 而且不需要在两端用 $$ 界定。 在公式的末尾或者一行公式的 \\ 换行符之前, 写 (\#eq:mylabel) , 其中 mylabel 是自己给公式的文字标签, 文字标签可以使用英文字母、数字、减号、下划线。

    \begin{align}
    f(x) =& \sum_{k=0}^\infty \frac{1}{k!} x^k (\#eq:efunc-sum) \\
      = e^x (\#eq:efunc-ex)
    \end{align}

    将会对两行公式自动编号。 引用公式时, 用如 \@ref(eq:mylabel) ,其中 mylabel 是公式的自定义标签, 编译后这样的引用会变成带有链接的圆括号内的编号。

    公式编号在全书中都不要有冲突(不同的公式定义了相同的编号)。 一种办法是,自定义的公式标签的开头以章节文件名开头。

    B.7 定理类编号

    定理、引理、命题、例题等, 使用特殊的markdown代码格式, 以三个冒号开头, 以三个冒号结尾, 在开头的三个反单撇号后面空格后写 {.theorem} 表示定理。 在 .theorem 后面, 可以用空格分隔后写一个定理的自定义标签, 标签以 # 开头,由字母、数字、减号组成, # 号作为标签的开头标志但不作为标签的一部分。 可以用 name="定理名称" 指定一个显示的定理名。

    设某个定理的自定义标签是 #mythlabel , 则可以用如 \@ref(thm:mythlabel) 引用此定理的编号, 编号是在每一章内从头编号的。 编号有自动生成的链接。

    ::: {.theorem #norlim-weakconv name="弱收敛"}
    $\xi_n$依分布收敛到$\xi$,
    当且仅当对任意$\mathbb R$上的一元实值连续函数$f(\cdot)$都有
      E f(\xi_n) \to E f(\xi), \ n \to \infty .
    

    当定理或例子内有列表时, 一定注意列表前后要空行, 否则会导致嵌套错误。 这种错误在编译HTML时无法发现, 但是会造成结果莫名其妙地出错。

    bookdown提供了证明环境, 但是不太实用。

    theorem替换成example, 在引用时将thm替换成exm
    ::: {.example #noralim-aspr-ce name="依概率收敛不a.s.收敛反例"}
    a.s.收敛推出依概率收敛,
    但是反之不然。给出反例。
    

    定理类的段落包括如下的种类:

    表B.1: 定理类段落 默认显示名

    bookdown使用.bib格式的文献数据库, 关于.bib格式的文献数据库请参考LaTeX的有关说明。 在index.Rmd的YAML元数据部分或者_bookdown.yml中用bibliography可以设置使用的一个或者多个.bib格式的文献数据库文件。 设某篇文章的.bib索引键是Qin2007:comp, 用 @Qin2007:comp 可以引用此文献, 用[@Qin2007:comp] 可以生成带有括号的引用。

    指定.bib文件时可以用相对路径, 如“../docs/mybib.bib”。 有多个文件时, 写在方括号[]中并用逗号分隔, 如bibliography: [mybib.bib, ../docs/refs.bib]

    为了使得产生的文献引用包括跳转超链接, 可以在index.Rmd的元数据部分添加link-citations: true设置。

    为了生成某个R扩展包的.bib格式的引用, 可以用R程序制作,例如:

    bookdown图书的插图有两种, 一种是已经保存为图形文件的, 主要是png、jpg和pdf图片; 另一种是文中的R代码生成的图形。

    已经有图形文件的, 可以用markdown格式原来的插图方法, 见markdown格式介绍。 但是,这样做不能给图形自动编号, 另外因为制作图书是有网页和PDF书两种主要输出格式的, 原有的插图方式在这两种输出格式上有细微的不一致。 所以,最好是统一使用Rmd的插图方法。

    Rmd的插图方法就是写一段R代码段来插图, 如果是用程序作图,则代码中写作图的代码; 如果是已有的图形文件, 可以在一个单独的R代码段中用类似下面的命令插图:

    knitr::include_graphics("figs/myfig01.png")

    其中figs是存放图形文件的子目录名, myfig01.png是要插入的图形文件名。 如果同时还有myfig01.pdf的话, 则HTML输出使用png图片而PDF输出自动选用pdf文件。 插图的选项在代码段的选项中规定: 用代码段的fig.withfig.height选项指定作图的宽和高(英寸), 用out.widthout.height选项指定在输出中实际显示的宽和高, 实际显示的宽和高如果使用如"90%"这样的百分数单位则可以自动适应输出的大小。

    为了使得插图可以自动编号并可以被引用, 为代码段指定标签并增加一个fig.cap="..."选项指定图形标题。 代码段的标签变成浮动图形的标签,如myfiglabel, 则为了引用这个图只要用\@ref(fig:myfiglabel)。 注意,在整本书中这些标签都不能重复, 否则编译LaTeX支持的PDF输出会失败。

    有些插图会伴随很长的说明文字, 这可以用代码段的fig.cap=选项指定, 但是其中的Markdown特有的格式在转换LaTeX时不一定支持, 而且在代码段选项中写太长的文字说明也是的程序难以辨认。 可以使用文字引用的方式: 在单独的一段中, 用如下格式定义一段可引用的文字内容:

    (ref:mylabel) 这里用实际的文字内容代替,不允许换行,不能分段。

    其中mylabel是自己定义的仅由英文大小写字母、数字和减号组成的引用标志符。在需要使用这段文字的位置,用(ref:mylabel)这种格式引用。 注意定义和引用都是用的(ref:mylabel)语法。

    用R生成PDF格式的图形时, 需要指定中文作为family选项, 所以在每个源文件的开头应该加上如下的设置, 使得生成PDF图时中文能够正确显示:

    ```{r setup-pdf, include=FALSE}
    pdf.options(family="GB1")
    

    其中include=FALSE表示要不显示代码段的代码, 有运行结果也不插入到输出结果中, 是否允许运行视缺省的eval=的值而定。

    B.10 表格

    B.10.1 Markdown表格

    bookdown书的表格也有两种, 一种是原来markdown格式的表格, 最好仅使用管道表, 管道表对中文内容支持最好。 为了对这样的表格自动编号, 需要在表格的前面或者后面空开一行的位置,

    Table: (\#tab:mylabel) 表的说明 

    其中mylabel是自定义的表格标签。 在引用这个表时用如 \@ref(tab:mylabel)

    B.10.2kable()函数制作表格

    另一种表格是R代码生成的表格, 主要使用knitr::kable()函数。 在knitr::kable()函数中用选项caption=指定表格的说明文字(标题), 这时生成表格的R代码段的标签,如myfiglab, 就自动构成了表格的引用标签主干, 实际引用如 \@ref(tab:myfiglab)

    加选项digits, 可以指定小数点后的数字位数。 不同列使用不同位数时, 可以指定一个包含各列小数点后位数的向量。

    为了适应较长的表, 可以在LaTeX的preamble.tex中引入longtable包, 并在knitr::kable()中加选项longtable=TRUE

    可以设置kable()显示缺失值的方式,

    如果要对表格进行更丰富的定制, 可以使用kableExtra包

    flextable和fluxtable支持较多的输出格式和常见表格功能。

    还有许多扩展包,不一一列举。

    B.11 数学公式的设置

    bookdown在生成PDF时使用LaTeX软件, 所以PDF输出的数学公式的支持很好, 但是LaTeX编译器也很挑剔, 稍微一点错误也造成编译失败。 比如,在行内公式内部如果紧邻$符号有多余的空格, 如$ y $,编译PDF时会出错。

    bookdown生成的gitbook格式的网页书籍, 在有数学公式时, 使用MathJax库在浏览器中显示数学公式。 MathJax是用于网络浏览器中显示数学公式的优秀的Javascript程序库, 可免费使用。 当数学公式中含有中文(用\text{}\mbox{}命令)时, 数学公式可能会显示不正常。 另外,数学公式默认使用远程服务器上的MathJax程序库处理, 在网络不通畅时显示很慢或者无法显示。 bookdown中使用MathJax的版本2, 但MathJax已经升级到版本3, 版本3有很大改动, 暂时还应该使用版本2以避免冲突。

    为了避免远程调用MathJax程序库的麻烦, 改为本地使用。 将MathJax安装在了书生成的网站主目录的上三层,用../../../MathJax/mathjax.js路径访问。 假设下载整个MathJax库后解压放在了书的网页文件所在子目录的上三层的位置。

    增加设置文件_header.html

    B.12.1 学位论文

    Ed Berry在网上分享了用bookdown生成PDF学位论文的经验: https://eddjberry.netlify.com/post/writing-your-thesis-with-bookdown/ Chester Ismay提供了一个R扩展包thesisdown, https://github.com/ismayc/thesisdown, 例子见https://thesisdown.netlify.com/

    B.12.2 LaTeX

    有数学公式时, 对行内公式边缘处多余的空格十分敏感, 所以行内公式边缘不要有空格。

    如果已经有用LaTeX写的书, 要转换为bookdown的Rmd格式, 可以用RStudio的支持RegEx的替换模式,如

  • \\keyword{([^}]+?)}替换成**\1**
  • \\textbf{([^}]+?)}替换成**\1**
  • \\texttt{([^}]+?)}替换成\1
  • 可以写一个函数对LaTeX文件进行转换生成Rmd文件, 再手工修改。函数如

    Rmd格式对算法编排的支持不够好。 编排算法可以用表格来换行, 仍用\qquad\qquad缩进, 不要用空格缩进,因为在LaTeX转PDF时空格会损失。 但是算法内容中有公式含有竖线时还是无法与表格线区分开来。

    编排算法也可以用数学公式, 写在$$界定范围内, 用aligned环境分行, 缩进使用\quad\qquad。 只是无法对if这样的关键字用重体排印。

    B.12.4 中文乱码

    为了能够生成中文的PDF,不要指定documentclass为ctexbook, 而是指定为book,然后在preamble.tex中引入ctex包。

    为了PDF输出,不要引入太多的数学包, 因为从markdown到HTML不支持复杂的数学。

    用R作图时如果图形中有汉字, 在代码块选项中加上dev="png", dpi=300。 否则生成PDF时会有中文编码问题。 另一办法是在每个.Rmd文件开头的setup源代码段插入

    Bookdown在网页和PDF输出格式中都支持PNG, 所以这是应尽量采纳的格式。 也支持JPEG和PDF格式,但网页中可能无法显示PDF格式。 支持SVG格式,但仅在网页中可显示。

    对于少量的图形文件, 可以安装一个图像编辑软件GIMP, 这是一个自由软件, 与PhotoShop功能类似。 要将一个SVG文件转换为PNG, 可以在GIMP中打开, 打开时可以选一个放大比例,如2倍, 然后调用文件菜单的导出功能, 将扩展名改为“.png”就可以保存成PNG。

    如果有大批图片格式要转换, 可以安装ImageMagick软件。 可以用命令行命令转换, 这样可以编程生成一系列的转换命令进行批量转换。 在Windows的命令行窗口运行转换命令如:

    magick test.svg -resize 300% test.png

    产生批量转换命令如: