-
Notifications
You must be signed in to change notification settings - Fork 25
/
other-softwares.Rmd
1615 lines (1183 loc) · 52.3 KB
/
other-softwares.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# 其它软件 {#chap-other-softwares}
```{r setup, include=FALSE}
library(reticulate)
knitr::opts_chunk$set(python.reticulate = TRUE, cache = TRUE)
# 启用 required = TRUE 是让 reticulate 使用指定的 Python 虚拟环境,而不是让它漫无目的地到处找
reticulate::use_virtualenv(virtualenv = Sys.getenv("RETICULATE_PYTHON_ENV"), required = TRUE)
# reticulate::py_discover_config()
library(nomnoml)
```
> I think, therefore I R.
>
> --- William B. King [^William-King]
[^William-King]: https://ww2.coastal.edu/kingw/statistics/R-tutorials/
## 文本编辑器 {#sec-text-editor}
代码文件也是纯文本,RStudio 集成了编辑器,支持语法高亮。Windows 系统上优秀的代码编辑器有 Notepad++ 非常轻量。Markdown 文本编辑器我们推荐 Typora 编辑器,它是跨平台的,下面以 Ubuntu 环境为例,介绍安装和使用过程:
```bash
# or run:
# sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA300B7755AFCFAE
wget -qO - https://typora.io/linux/public-key.asc | sudo apt-key add -
# add Typora's repository
sudo add-apt-repository 'deb https://typora.io/linux ./'
sudo apt-get update
# install typora
sudo apt-get install typora
```
```{r typora-theme, fig.cap="Typora 主题",fig.subcap=c("默认的主题", "Vue 主题"), echo=FALSE,fig.show='hold', out.width="45%"}
knitr::include_graphics(path = c('screenshots/typora-theme-default.png', 'screenshots/typora-theme-vue.png'), dpi = NA)
```
设置中文环境,并且将主题风格样式配置为 Vue,见图\@ref(fig:typora-theme)(右),Vue 主题可从 Typora 官网下载 <https://theme.typora.io/theme/Vue/>。
1. Atom 编辑器 <https://atom.io/>
```bash
sudo add-apt-repository ppa:webupd8team/atom
sudo apt-get update
sudo apt-get install atom
```
1. Code 编辑器微软出品 <https://code.visualstudio.com/>
1. Notepad++ 开源的 Windows 平台上的编辑器 <https://notepad-plus-plus.org/>
1. VI & VIM 开源的跨平台编辑器
1. Atom 和 Code 有商业公司支持的开源免费的跨平台的编辑器
1. VI/VIM 和 Emacs 是跨平台的编辑器
1. Markdown 编辑器 + blogdown 记笔记
1. Typora Markdown 编辑器,支持自定义 CSS 样式
## 代码编辑器 {#sec-code-editor}
VS Code, Sublime Text 和 Atom
## 集成开发环境 {#sec-rstudio-ide}
[RStudio 公司的愿景](https://rstudio.com/slides/rstudio-pbc/),介绍 RStudio 开发环境提供的效率提升工具或功能
### RStudio 桌面版 {#rstudio-desktop-ide}
```{r rstudio-desktop,fig.cap="开源桌面版 RStudio 集成开发环境",echo=FALSE,out.width="75%"}
knitr::include_graphics(path = 'screenshots/rstudio-desktop.png')
```
```bash
# mongolite
sudo dnf install -y openssl-devel cyrus-sasl-devel
# sodium
sudo dnf install -y libsodium-devel
# rJava
R CMD javareconf
```
```{r,eval=FALSE}
# https://github.com/s-u/rJava
# shinytest::installDependencies()
db <- rstudioapi::getRStudioPackageDependencies()
invisible(lapply(db$name, function(pkg) {
if (system.file(package = pkg) == "") {
install.packages(pkg)
}
}))
```
[rsthemes](https://github.com/gadenbuie/rsthemes) 主题
### RStudio 服务器版 {#rstudio-server-ide}
RStudio Server 开源服务器版可以放在虚拟机里或者容器里,RStudio 桌面版装在服务器上,服务器为 Ubuntu/CentOS/Windows 系统,然后本地是 Windows 系统,可以通过远程桌面连接服务器,使用 RStudio;
```{r vbox-rstudio,fig.cap="虚拟机里的 RStudio",echo=FALSE,out.width="75%"}
knitr::include_graphics(path = 'screenshots/rstudio-vbox.png')
```
服务器上启动 Docker ,运行 RStudio 镜像,本地通过桌面浏览器,如谷歌浏览器登陆连接。
```{r docker-rstudio,fig.cap="容器里的 RStudio",echo=FALSE,out.width="75%"}
knitr::include_graphics(path = 'screenshots/rstudio-docker.png')
```
1. 下载 RStudio IDE
我们从 RStudio 官网[下载][rstudio-download]开源桌面或服务器版本,服务器版本的使用介绍见[文档](https://docs.rstudio.com/ide/server-pro/),最常见的就是设置端口
```bash
wget https://download2.rstudio.org/rstudio-server-1.1.456-amd64.deb
sudo apt-get install gdebi
sudo gdebi rstudio-server-1.1.456-amd64.deb
```
1. 设置端口
在文件 `/etc/rstudio/rserver.conf` 下,设置
```
www-port=8181
```
注意:修改 `rserver.conf` 文件后需要重启才会生效
```bash
sudo rstudio-server stop
sudo rstudio-server start
```
接着获取机器的 IP 地址,如 192.168.141.3
```bash
ip addr
```
```
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:59:c0:fb brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
valid_lft 83652sec preferred_lft 83652sec
inet6 fe80::a00:27ff:fe59:c0fb/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:09:33:0d brd ff:ff:ff:ff:ff:ff
inet 192.168.141.3/24 brd 192.168.141.255 scope global dynamic enp0s8
valid_lft 547sec preferred_lft 547sec
inet6 fe80::a00:27ff:fe09:330d/64 scope link
valid_lft forever preferred_lft forever
```
然后,就可以从本地浏览器登陆 RStudio 服务器版本,如 <http://192.168.141.3:8181/>
[rstudio-download]: https://www.rstudio.com/products/rstudio/download/
::: {.rmdtip data-latex="{提示}"}
rstudio-server 已经收录在 Fedora 33+ 仓库中了,详情见 <https://cran.r-project.org/bin/linux/fedora/>
:::
授权问题 [ERROR system error 13 (Permission denied)](https://community.rstudio.com/t/rserver-1692-error-system-error-13-permission-denied/46972/10)
[How to Disable SELinux Temporarily or Permanently](https://www.tecmint.com/disable-selinux-in-centos-rhel-fedora/)
### Shiny 服务器版 {#shiny-server}
shiny 开源服务器版
### Eclipse + StatET {#eclipse-plus-statet}
Eclipse 配合 StatET 插件 <http://www.walware.de/goto/statet> 提供R语言的集成开发环境 <https://projects.eclipse.org/projects/science.statet>
```{r eclipse-statet,fig.cap="基于 Eclipse 的 R 集成开发环境 StatET",echo=FALSE,out.width="75%"}
knitr::include_graphics(path = "screenshots/eclipse-statet.png")
```
StatET 基于 Eclipse 首次建立索引很慢,估计半小时到一个小时,添加新的 R 包后,每次启动 StatET 也会建立索引缓存,此外,Eclipse 开发环境占用内存比较多,配置 StatET 的过程如下
### Emacs + ESS {#emacs-plus-ess}
Emacs 配合 ESS 插件 <https://ess.r-project.org/>
### Nvim-R {#vim-plus-r}
Nvim-R 是一个基于 Vim 的集成开发环境 <https://github.com/jalvesaq/Nvim-R>
## Pandoc 文档处理 {#sec-pandoc}
Pandoc 是一个万能文档转化器,安装 pandoc,下载网址 <https://github.com/jgm/pandoc/releases/latest>
```bash
sudo apt-get install gdebi-core
wget https://github.com/jgm/pandoc/releases/download/2.9.2/pandoc-2.9.2-1-amd64.deb
sudo chmod +x pandoc-2.9.2-1-amd64.deb
sudo gdebi pandoc-2.9.2-1-amd64.deb
```
rmarkdown 包裹了 Pandoc 工具,使用 `rmarkdown::render()` 函数即可将 R Markdown 文档转化为 HTML、LaTeX 和 Markdown 等格式。
## Calibre 书籍管理 {#sec-calibre}
[Calibre](https://calibre-ebook.com) 是一款电子书转化和管理软件,首先安装 calibre
```bash
sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin
```
calibre 可以将 epub 格式电子书文档转化为 mobi 格式,bookdown 已经给这个工具穿上了一件马甲,用户只需调用 `bookdown::calibre()` 函数即可实现电子书格式的转换。
## ImageMagick 图像处理 {#sec-ImageMagick}
图像的各种操作,包括合成、转换、旋转等等
首先安装 ImageMagick 软件包中的 convert 程序
```bash
asy -f jpg test.asy
```
指定分辨率
```bash
convert -geometry 1000x3000 -density 300 -units PixelsPerInch INPUT.eps OUTPUT.png
```
这样不改变图像的像素数,只是给出一个每个像素应该显示多大的提示。
```bash
convert -quality 100 -density 300x300 INPUT.pdf OUTPUT.png
```
高质量大图,给定像素,转化 eps 格式图片,需要先安装 Ghostscript
```bash
convert -geometry 1000x3000 INPUT.eps OUTPUT.png
```
```bash
convert -quality 100 -antialias -density 96 -transparent white -trim INPUT.pdf OUTPUT.png
```
|选项 |作用 |
|:---------------|:----------------|
|trim | 裁剪图像四周空白区域 |
|transparent color | 去除图像中指定的颜色 |
|density geometry | 设定图像的 DPI 值 |
|antialias | 让图像具有抗锯齿的效果 |
|quality | 图像压缩等级 |
像素、点等常见术语
|符号 |含义 |
|:------------|:-----------------------------------------------------|
| px | pixel 像素,电子屏幕上组成一幅图画或照片的最基本单元 |
| pt | point,点,印刷行业常用单位,等于1/72英寸 |
| ppi | pixel per inch,每英寸像素数,该值越高,则屏幕越细腻 |
| dpi | dot per inch,每英寸多少点,该值越高,则图片越细腻 |
多页的 PDF 文件转化为多张 PNG 图片
```bash
convert -quality 100 -density 300x300 INPUT.pdf OUTPUT.png
```
将多页 PDF 文件合成为 GIF 动图
```bash
convert -delay 60 -density 300x300 -background white -alpha remove \
-dispose previous INPUT.pdf -layers coalesce OUTPUT.gif
```
见益辉博客[一些 ImageMagick 命令](https://yihui.org/cn/2018/04/imagemagick/)
## OptiPNG 图片优化 {#sec-optipng}
[OptiPNG](http://optipng.sourceforge.net/) 是一个非常好的图片压缩、优化工具
现在,我们设置 chunk 选项 `optipng` 为非空(non-`NULL`)的值,例如,`''` 去激活这个 hook (益辉称之为钩子,这里勾的是 optipng 这个图片优化工具)
```{r}
knitr::knit_hooks$set(optipng = knitr::hook_optipng)
```
```{r optipng,fig.cap="没有优化", optipng = NULL}
library(ggplot2)
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) +
geom_point()
```
```{r optimize-png,fig.cap="优化", ref.label="optipng", optipng = '-o5'}
```
```bash
optipng -o5 filename.png
```
[TinyPNG](https://tinypng.com/)
```r
png_files = list.files(path = "image/path/", pattern = "*.png", full.names = TRUE)
xfun::tinify(input = png_files)
```
## PDFCrop 裁剪边空 {#sec-pdfcrop}
[PDFCrop](http://pdfcrop.sourceforge.net/) 可将 PDF 图片中留白的部分裁去,再也不用纠结 par 了
## PhantomJS 网页截图 {#sec-phantomjs}
Winston Chang 开发了 [webshot](https://github.com/wch/webshot) 包网页截图,它依赖 [PhantomJS](https://github.com/ariya/phantomjs/),所以首先需要安装
```{r,eval=FALSE,echo=TRUE}
install.packages("webshot")
webshot::install_phantomjs()
```
以截取网页 <https://www.r-project.org/> 为例,
```{r,eval=FALSE,echo=TRUE}
library(webshot)
webshot("https://www.r-project.org/", "r.png")
webshot("https://www.r-project.org/", "r.pdf") # Can also output to PDF
```
还可以截取 R Markdown 文档内容,注意是先编译 R Markdown 文档为 HTML 文档,然后截取网页
```{r,eval=FALSE,echo=TRUE}
rmdshot(system.file("examples/knitr-minimal.Rmd", package = "knitr"), file = "screenshots/knitr-minimal.png")
```
裁剪出特定大小的图片,需要额外的系统依赖 GraphicsMagick (recommended) or ImageMagick installed
```{r,eval=FALSE,echo=TRUE}
# Can specify pixel dimensions for resize()
webshot("https://www.r-project.org/", "r-small.png") %>%
resize("400x") %>%
shrink()
```
```
** Processing: r-small.png
400x442 pixels, 4x8 bits/pixel, RGB+alpha
Reducing image to 3x8 bits/pixel, RGB
Input IDAT size = 70570 bytes
Input file size = 70867 bytes
Trying:
zc = 9 zm = 8 zs = 0 f = 0 IDAT size = 59441
zc = 9 zm = 8 zs = 1 f = 0
zc = 1 zm = 8 zs = 2 f = 0
zc = 9 zm = 8 zs = 3 f = 0
zc = 9 zm = 8 zs = 0 f = 5
zc = 9 zm = 8 zs = 1 f = 5
zc = 1 zm = 8 zs = 2 f = 5
zc = 9 zm = 8 zs = 3 f = 5
Selecting parameters:
zc = 9 zm = 8 zs = 0 f = 0 IDAT size = 59441
Output IDAT size = 59441 bytes (11129 bytes decrease)
Output file size = 59714 bytes (11153 bytes = 15.74% decrease)
```
## Inkscape 矢量绘图 {#sec-inkscape}
[Inkscape](https://inkscape.org/) 是一款开源、免费、跨平台的矢量绘图软件。是替代 Adobe Illustrator(简称 AI) 最佳工具,没有之一
```bash
# Ubuntu 20.04 及之前版本
sudo add-apt-repository ppa:inkscape.dev/stable
sudo apt update
sudo apt install inkscape
```
PDF 图片格式转化为 SVG 格式
```bash
inkscape -l output-filename.svg input-filename.pdf
```
SVG 转 PDF 格式
```bash
inkscape -f input-filename.svg -A output-filename.pdf
```
```bash
inkscape --export-type=png in1.svg in2.svg
```
Jeroen Ooms 开发的 [rsvg](https://github.com/jeroen/rsvg) 包支持将 SVG 格式图片导出为 PNG、PDF、PS 等格式。使用它可以批量将 SVG 格式文件转化为其它格式文件,比如 PDF(`rsvg::rsvg_pdf`),PS (`rsvg::rsvg_ps`)和 PNG(`rsvg::rsvg_png`)
```{r rsvg, eval = FALSE, echo = TRUE}
svg_paths = list.files(path = "images", pattern = "*.svg", full.names = T)
for (svg in svg_paths) {
rsvg::rsvg_pdf(svg, file = gsub(pattern = "\\.svg", replacement= "\\.pdf", svg))
}
```
## QPDF PDF 文件操作 {#sec-qpdf}
Jeroen Ooms 开发的另一个 [qpdf](https://github.com/ropensci/qpdf) 包将 C++ 库 [qpdf](https://github.com/qpdf/qpdf) 搬运到 R 环境中,用于 PDF 文件的拆分 `pdf_split()`,组合 `pdf_combine()`,加密( 传递 `password` 参数值即可加密),提取 `pdf_subset()` 和压缩 `pdf_compress()` 等。下面以组合为例,就是将多个 PDF 文件合成一个 PDF 文件。
```{r qpdf,eval=FALSE,echo=TRUE}
library(qpdf)
pdf_paths = list.files(path = "images", pattern = "*.pdf", full.names = T)
pdf_combine(input = pdf_paths, output = "images/all.pdf", password = "")
```
PDF 操作:价值数百美元的开源替代方案,参考 Adobe Acrobat 的功能
## UML 标准建模图 {#sec-nomnoml}
UML (Unified Modeling Language) 表示统一建模语言
```{r convert-figure,fig.cap="图片制作、合成、优化、转换等常用工具",echo=FALSE}
nomnoml::nomnoml("
#stroke: black
#.box: fill=#8f8 dashed visual=ellipse
[Inkscape|制作转换]->[SVG]
[Inkscape]->[PDF]
[Inkscape]->[PNG]
[LaTeX|编译生成|
[TeX] --> [TinyTeX|XeLaTeX引擎]
[TinyTeX] -:> [PDF]
] ->[PDF]
[PNG] <- [OptiPNG|优化压缩]
[PDF] -> [PNG]
[GIFSKI|合成转换|
[PNG]导入-->[GIFSKI]
[GIFSKI]合成-:>[GIF]
] -> [GIF]
[GIF] <- [ImageMagick|合成转换|
[PNG]导入-->[ImageMagick]
[ImageMagick]合成-:>[GIF]
]
[PNG] <- [GraphicsMagick|合成转换|
[PNG]导入-->[GraphicsMagick]
[GraphicsMagick]转换-:>[PNG]
]
[GhostScript|字体嵌入] ->[PDF]
// [PNG] -> [GIF]
[PNG] -> [PDF]
[PNG] <- [Graphviz|编译生成]
[SVG] <- [Graphviz]
[PDF] <- [Graphviz]
[PNG] <- [PhantomJS|转化生成|
[HTML]导入-->[PhantomJS]
[PhantomJS]转换-:>[PNG]
]")
```
[Javier Luraschi](https://github.com/javierluraschi) 将 UML 绘图库 [nomnoml](https://github.com/skanaar/nomnoml) 引入 R 社区,开发了 [nomnoml](https://github.com/rstudio/nomnoml) 包,相比于 DiagrammeR 包,它显得非常轻量,网站 <https://www.nomnoml.com/> 还可以在线编辑、预览、下载 UML 图。 **webshot** 包可以将网页截图并插入 PDF 文档中。其它制作图形的工具见 \@ref(fig:convert-figure)。
nomnoml 调 webshot 包对网页截图生成 PNG 格式的图片,其中 webshot 调 phantomjs 软件。
nomnoml 制作 R Markdown 生态图,导出为 PNG 格式
安装 nomnoml
```r
install.packages("nomnoml")
```
安装 PhantomJS
```bash
brew install --cask phantomjs
```
```{r,eval=FALSE}
nomnoml::nomnoml("
#stroke: #26A63A
#.box: dashed visual=ellipse
#direction: down
[<box>HTML] -> [网页三剑客]
[<box>JavaScript] -> [网页三剑客]
[<box>CSS] -> [<table>网页三剑客|htmlwidgets|htmltools||sass|bslib||thematic|jquerylib]
[设计布局|bs4Dash|flexdashboard|shinydashboard] -> [<actor>开发应用|R Shiny]
[设计交互|waiter|shinyFeedback|shinyToastify] -> [<actor>开发应用|R Shiny]
[权限代理|shinyproxy|shinyauthr|shinymanager] -> [<actor>开发应用|R Shiny]
[网页三剑客] -> [<actor>开发应用|R Shiny]
[网页三剑客] -> [<actor>开发应用|R Shiny]
[网页三剑客] -> [<actor>开发应用|R Shiny]
[开发应用] <- [<table>处理数据|Base R|SQL||data.table|dplyr||tidyr|purrr]
[开发应用] <- [<table>制作表格|DT|gt||reactable|formattable||kableExtra|sparkline]
[开发应用] <- [<table>制作图形|ggplot2|plotly||echarts4r|leaflet||dygraphs|visNetwork]
", png = "shiny-app.png")
```
## Graphviz 流程图 {#sec-graphviz}
Graphviz 官网 <http://www.graphviz.org/>,常用于绘制流程图,广泛用于 tensorflow 和 mxnet 的模型描述中
```{r data-workflow, engine = "dot", echo=FALSE, fig.cap="数据分析流程图", cache=TRUE}
digraph demo {
graph [layout = circo];
node [shape = rectangle, style = filled, fillcolor = Linen];
data [label = "数据集", shape = folder, fillcolor = Beige];
Import [label = "数据导入"];
Tidy [label = "数据清理"];
Transform [label = "数据处理"];
Explore [label = "探索性分析"];
Modeling [label = "数据建模"];
Explain [label= "结果解释"];
Visualize [label = "结果展示"];
Communicate [label = "交流分析"];
edge [style=dashed, color=red];
data -> Import -> Tidy -> Transform -> Explore -> Modeling -> Explain -> Visualize -> Communicate;
Modeling -> Transform;
Communicate -> Transform;
}
```
[**DiagrammeR**](https://github.com/rich-iannone/DiagrammeR) 包将 Graphviz 引入 R 语言
```{r,eval=FALSE}
library(DiagrammeR)
library(DiagrammeRsvg)
library(magrittr)
library(rsvg)
graph <-
"graph {
rankdir=LR; // Left to Right, instead of Top to Bottom
a -- { b c d };
b -- { c e };
c -- { e f };
d -- { f g };
e -- h;
f -- { h i j g };
g -- k;
h -- { o l };
i -- { l m j };
j -- { m n k };
k -- { n r };
l -- { o m };
m -- { o p n };
n -- { q r };
o -- { s p };
p -- { s t q };
q -- { t r };
r -- t;
s -- z;
t -- z;
}
"
# 导出图形
grViz(graph) %>%
export_svg %>% charToRaw %>% rsvg_pdf("graph.pdf")
grViz(graph) %>%
export_svg %>% charToRaw %>% rsvg_png("graph.png")
grViz(graph) %>%
export_svg %>% charToRaw %>% rsvg_svg("graph.svg")
```
## LaTeX 排版工具 {#sec-latex}
另外值得一提的是 TikZ 和 PGF(Portable Graphic Format)宏包,支持强大的绘图功能,图形质量达到出版级别,详细的使用说明见宏包手册 <https://pgf-tikz.github.io/pgf/pgfmanual.pdf>。
### TinyTeX 发行版 {#sub:latex-tinytex}
```{r,eval=FALSE}
library(tinytex)
# 升级 TinyTeX 发行版
upgrade_tinytex <- function(repos = NULL) {
# 此处还要考虑用户输错的情况和选择离用户最近(快)的站点
if(is.null(repos)) repos = "https://mirrors.tuna.tsinghua.edu.cn/CTAN/"
file_ext <- if (.Platform$OS.type == "windows") ".exe" else ".sh"
tlmgr_url <- paste(repos, "/systems/texlive/tlnet/update-tlmgr-latest", file_ext, sep = "")
file_name <- paste0("update-tlmgr-latest", file_ext)
download.file(url = tlmgr_url, destfile = file_name,
mode = if (.Platform$OS.type == "windows") "wb" else "w")
# window下 命令行窗口下 如何执行 exe 文件
if(.Platform$OS.type == "windows"){
shell.exec(file = file_name)
file.remove("update-tlmgr-latest.exe")
}
else{
system("sudo sh update-tlmgr-latest.sh -- --upgrade")
file.remove("update-tlmgr-latest.sh")
}
# 类似地 Linux 下执行 sh
# 升级完了 删除 update-tlmgr-latest.exe
}
```
[Winston Chang](https://github.com/wch) 整理了一份 LaTeX 常用命令速查小抄 <https://wch.github.io/latexsheet/latexsheet.pdf>
### 安装和更新 {#subsec-tlmgr-setup}
tlmgr (TeXLive Manager) 是 LaTeX 包管理器
```bash
# 就近选择 CTAN 镜像站点
tlmgr option repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet
tlmgr option repository http://mirror.ctan.org/systems/texlive/tlnet
# 可更新的 TeX 包列表
tlmgr update --list
# 更新所有已经安装的 TeX 包
tlmgr update --all
# 更新 tlmgr 管理器本身
tlmgr update --self
# 安装
tlmgr install ctex fandol
# 列出套装
tlmgr list schemes
tlmgr list collections
# 列出已经安装的 TeX 包
tlmgr list --only-installed
# 安装 GPG 公钥(只限Win/Mac)
tlmgr --repository http://www.preining.info/tlgpg/ install tlgpg
```
### 查询和搜索 {#subsec-tlmgr-search}
```bash
tlmgr search *what*
```
参数 `\*what\*` 是正则表达式
```{bash}
tlmgr search --file tikz.sty
```
等价于
```{r}
tinytex::tlmgr_search('tikz.sty')
```
这样,我们就可以知道要使用 `\usepackage{tikz}` 就得先安装 **pgf** 包,此外,管道命令也是支持的
```bash
tlmgr search --file font | grep math
```
查询 CTAN 仓库列表
```bash
tlmgr repository list
```
一般地, 只显示已安装的 LaTeX 宏包的名字及大小
```bash
tlmgr info --list --only-installed --data name,size
```
更多命令详见[tlmgr 管理器手册](https://www.tug.org/texlive/doc/tlmgr.html#install-option-...-pkg)
### TikZ 绘图工具 {#subsec-latex-tikz}
TikZ 绘制书籍封面 <https://latexdraw.com/how-to-create-a-beautiful-cover-page-in-latex-using-tikz/>
TikZ 绘制知识清单,书籍章节结构等 <https://www.latexstudio.net/index/lists/barsearch/author/1680.html>
更多例子参考 <https://github.com/FriendlyUser/LatexDiagrams>
## Octave 科学计算 {#sec-octave}
```{r, engine='octave', eval=FALSE}
%% fig1
tx = ty = linspace (-8, 8, 41)';
[xx, yy] = meshgrid (tx, ty);
r = sqrt (xx .^ 2 + yy .^ 2) + eps;
tz = sin (r) ./ r;
mesh (tx, ty, tz);
xlabel ("tx");
ylabel ("ty");
zlabel ("tz");
title ("3-D Sombrero plot");
% fig2
x = 0:0.01:3;
hf = figure ();
plot (x, erf (x));
hold on;
plot (x, x, "r");
axis ([0, 3, 0, 1]);
text (0.65, 0.6175, ['$\displaystyle\leftarrow x = {2\over\sqrt{\pi}}'...
'\int_{0}^{x}e^{-t^2} dt = 0.6175$']);
xlabel ("x");
ylabel ("erf (x)");
title ("erf (x) with text annotation");
set (hf, "visible", "off");
print (hf, "plot15_7.pdf", "-dpdflatexstandalone");
set (hf, "visible", "on");
system ("pdflatex plot15_7");
open ("plot15_7.pdf");
%% fig3
clf ();
surf (peaks);
peaks(50)
print -dpswrite -PPS_printer
%% images/peaks-inc
hf = figure (1);
surf (peaks);
print (hf, "peaks.pdf", "-dpdflatexstandalone");
%% windows
hf = figure (1);
peaks(10);
print (hf, "peaks.pdf", "-dpdf");
print (hf, "peaks.eps", "-color"," -deps");
print (hf, "peaks.svg", "-color"," -dsvg");
%% windows
hf = figure (1);
peaks(50);
print (hf, "peaks-more.eps", "-color"," -deps");
print (hf, "peaks-more.svg", "-color"," -dsvg");
```
## Python 环境配置 {#sec-setup-python}
首先创建一个 Python 虚拟环境,环境隔离可以减少对系统的侵入,方便迭代更新和项目管理。创建一个虚拟环境,步骤非常简单,下面以 CentOS 8 为例:
1. 安装虚拟模块 virtualenv
```bash
sudo dnf install -y virtualenv
```
1. 准备 Python 虚拟环境存放位置
```bash
sudo mkdir -p /opt/.virtualenvs/r-tensorflow
```
1. 给虚拟环境必要的访问权限
```bash
sudo chown -R $(whoami):$(whoami) /opt/.virtualenvs/r-tensorflow
```
1. 初始化虚拟环境
```bash
virtualenv -p /usr/bin/python3 /opt/.virtualenvs/r-tensorflow
```
1. 激活虚拟环境,安装必要的模块
```bash
source /opt/.virtualenvs/r-tensorflow/bin/activate
pip install numpy
```
一般来讲,系统自带的 pip 版本较低,可以考虑升级 pip 版本。
```bash
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
```
根据项目配置文件 requirements.txt 安装多个 Python 模块,每个 Python 项目都应该有这么个文件来描述项目需要的依赖环境,包含 Python 模块及其版本号。
```bash
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
```
指定 Python 模块的镜像地址,加快下载速度,特别是对于国内的环境,加速镜像站点非常有意义,特别是遇到大型的 Python 模块,比如 tensorflow 框架
```bash
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow
```
conda 创建 Python 3.8 虚拟环境,并命名为 tensorflow
```bash
conda create -n tensorflow python=3.8
```
激活 tensorflow 环境
```bash
conda activate tensorflow
```
## Python 基础绘图 {#sec-plot-python}
Python 的 matplotlib 模块支持保存的图片格式有 eps, pdf, pgf, png, ps, raw, rgba, svg, svgz,不支持 cairo\_pdf 绘图设备,所以这里使用 pdf 设备,但是这样会导致图形没有字体嵌入,从而不符合出版要求。一个解决办法是在后期嵌入字体,图形默认使用数学字体 [STIX](http://www.stixfonts.org/) 和英文字体 [DejaVu Sans](https://dejavu-fonts.github.io/),所以需要预先安装这些字体。
```bash
# CentOS 8
sudo dnf install -y dejavu-fonts-common dejavu-sans-fonts \
dejavu-serif-fonts dejavu-sans-mono-fonts
```
借助 **grDevices** 包提供的 `embedFonts()` 函数,它支持 postscript 和 pdf 图形设备,嵌入字体借助了 [Ghostscript](https://www.ghostscript.com/) 以及 PDF 阅读器 [MuPDF](https://www.mupdf.com/)
::: {.rmdnote data-latex="{注意}"}
Windows 系统下需要手动指定 Ghostscript 安装路径,特别地,如果你想增加可选字体范围,需要指定相应字体搜索路径,而 Linux/MacOS 平台下不需要关心 Ghostscript 的安装路径问题,
```{r,eval=FALSE,echo=TRUE}
Sys.setenv(R_GSCMD = "C:/Program Files/gs/gs9.26/bin/gswin64c.exe")
embedFonts(
file = "cm.pdf", outfile = "cm-embed.pdf",
fontpaths = system.file("fonts", package = "fontcm")
)
embedFonts(file = "cm.pdf", outfile = "cm-embed.pdf")
```
:::
另一个解决办法是使用 LaTeX 渲染图片中的文字,这就需要额外安装一些 LaTeX 宏包,此时默认执行渲染的 LaTeX 引擎是 PDFLaTeX。
```bash
tlmgr install type1cm cm-super dvipng psnfss ucs ncntrsbk helvetic
```
每年 4 月是 TeX Live 的升级月,升级指导见 <https://www.tug.org/texlive/upgrade.html>,升级之后,需要更新所有 LaTeX 宏包。
```bash
tlmgr update --self --all
```
如下图所示,我们采用第二个方法,它可以支持更好的数学公式显示,更多详情见 <https://matplotlib.org/tutorials/text/mathtext.html>。
```{python matplotlib, fig.cap="matplotlib 示例", echo=FALSE, dev=ifelse(knitr::is_html_output(), 'svg', ifelse(knitr::is_latex_output(), 'pdf', 'png')), out.width='75%', fig.width=4, fig.height=3, collapse=TRUE, eval=FALSE}
import matplotlib.pyplot as plt
from matplotlib import rcParams
# 其它可配置选项见 rcParams.keys()
rcParams.update({'font.size': 10, 'text.usetex': True})
# rcParams.update({'font.family': ['sans-serif'],
# 'font.monospace': ['DejaVu Sans Mono'],
# 'font.sans-serif': ['DejaVu Sans'],
# 'font.serif': ['DejaVu Serif']})
plt.switch_backend('agg')
plt.plot([0, 2, 1, 4])
plt.xlabel(r'Coord $x$')
plt.ylabel(r'Coord $y$')
plt.tight_layout()
plt.show()
```
::: {.rmdtip data-latex="{提示}"}
如果你的系统是 Windows/MacOS 可以添加 GPG 验证以增加安全性,最简单的方式就是:
```bash
tlmgr --repository http://www.preining.info/tlgpg/ install tlgpg
```
:::
二维函数 $f(x,y) = 20 + x^2 + y^2 - 10*\cos(2*\pi*x) - 10*\cos(2*\pi*y)$ 最小值 0,最大值 80
```{python rastrigin-function, dev = ifelse(knitr::is_html_output(), 'svg', ifelse(knitr::is_latex_output(), 'pdf', 'png')), fig.cap="Python 绘制三维图形:Rastrigin 函数图形", fig.width=4, fig.height=3, out.width='75%', collapse=TRUE, eval=FALSE}
from math import cos, pi
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib import rcParams
rcParams.update({'font.size': 18, 'text.usetex': True})
# 其它可配置选项见 rcParams.keys()
plt.switch_backend('agg')
xDomain = np.arange(-5.12, 5.12, .08)
yDomain = np.arange(-5.12, 5.12, .08)
X, Y = np.meshgrid(xDomain, yDomain)
z = [20 + x**2 + y**2 - (10*(cos(2*pi*x) + cos(2*pi*y))) for x in xDomain for y in yDomain]
Z = np.array(z).reshape(128,128)
fig = plt.figure(figsize = (12,10))
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap=cm.RdYlGn, linewidth=1, antialiased=False)
ax.set_xlim(-5.12, 5.12)
ax.set_ylim(-5.12, 5.12)
ax.set_zlim(0, 80)
# fig.colorbar(surf, aspect=30)
# plt.title(r'Rastrigin Function in Two Dimensions')
plt.tight_layout()
plt.show()
```
## Python 基础操作 {#sec-basic-python}
- 张量操作 [numpy](https://github.com/numpy/numpy) <https://numpy.org/> 向量、矩阵操作
- 科学计算 [scipy](https://github.com/scipy/scipy) <https://scipy.org/> 统计、优化和方程
- 数据操作 [pandas](https://github.com/pandas-dev/pandas/) <https://pandas.pydata.org/> 面向数据分析
- 数据可视化 [matplotlib](https://github.com/matplotlib/matplotlib) <https://matplotlib.org/> 静态图形
- 交互可视化 [bokeh](https://github.com/bokeh/bokeh) <https://bokeh.org/>
- 机器学习 [scikit-learn](https://github.com/scikit-learn/scikit-learn) <https://scikit-learn.org/> 面向机器学习
- 深度学习 [tensorflow](https://github.com/tensorflow/tensorflow) <https://tensorflow.org/> 面向深度学习
A Python implementation of global optimization with gaussian processes. [Bayesian Optimization](https://github.com/fmfn/BayesianOptimization)
用 numpy 实现一个统计类的算法,比如线性回归、稳健的线性回归、广义线性回归,数据集用 Python 内置的
```{python}
import numpy as np
np.zeros(3) # vector
np.ones(3) # vector
np.diag([1,1,1]) # identy matrix
# np.multiply()
np.cumsum([1,1,1])
```
Python 模块 scikit-learn [@scikit-learn] 内置的数据集 iris 为例 <https://scikit-learn.org/stable/datasets/index.html>
<!--
```{python}
# import pandas as pd
# import numpy as np
# import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris(as_frame=True)
# X
iris.data.head()
# Y
iris.target.head()
```
-->