要安装最新的 R 版本(包括推荐的软件包以及开发头文件和工具),请运行
$ sudo dnf install R
或者对于旧版本的 EPEL,使用 yum
代替 dnf
。这个 “R” RPM 是一个元包。它没有内容,但确保安装了以下组件
组件 | 描述 |
---|---|
R-core | 运行时所需的最小 R 组件 |
R-core-devel | 用于开发 R 包的核心文件(不含 Java) |
R-java | 带有 Fedora 提供的 Java 运行时环境的 R |
R-java-devel | 用于与启用 Java 的 R 组件一起使用的开发包 |
libRmath | 来自 R 项目的独立数学库 |
libRmath-devel | 来自 R 独立数学库的头文件 |
这种划分允许进行最小安装(例如,不含 Java,不含开发工具……),但通常 R 用户需要所有组件才能从源代码安装任何包。因此,建议安装 “R” 元包。
R 的 Fedora RPM 已由 企业 Linux 附加软件包 (EPEL) 项目移植到 CentOS/RHEL。这些 RPM 也与从 CentOS/RHEL 派生的发行版兼容。
要使用 EPEL 仓库,只需下载并安装相应的 “epel-release” RPM,如 EPEL 常见问题解答中所述。然后,可以按照上述方法安装 R。
R 安装分为两个目录
/usr/lib/R
(在 64 位架构中为 /usr/lib64/R
)包含 R 二进制文件和库。/usr/share/R
包含文档、许可证和其他非二进制文件。同样,
/usr/lib/R/library
(在 64 位架构中为 /usr/lib64/R/library
)包含系统提供的带有二进制代码的软件包。/usr/share/R/library
包含系统提供的没有二进制代码的软件包。此外,R 安装还会添加以下路径
/usr/local/lib/R/library
(64 位架构相同),官方仓库中的任何软件包都不会使用它。/home/<user>/R/<architecture>-redhat-linux-gnu-library/<version>
,这是使用 install.packages
从 R 控制台安装的任何软件包的目的地。例如,以下是安装了 R 4.0 的 x86_64 机器上的库路径
.libPaths()
#> [1] "/home/<user>/R/x86_64-redhat-linux-gnu-library/4.0"
#> [2] "/usr/local/lib/R/library"
#> [3] "/usr/lib64/R/library"
#> [4] "/usr/share/R/library"
推荐的 R 软件包包含在 R-core 组件中。来自 CRAN、Bioconductor 和其他来源的许多附加软件包可以通过官方仓库轻松获得。因此,运行
$ dnf repoquery --repo=fedora-source R-*
提供了一个完整的列表。
以下列表显示了 Fedora Linux 36(三十六)上所有可用的 R 软件包 RPM,按通常用于从 R 内部安装软件包的 R 仓库分类(请参阅帮助页面 ?chooseRepositories
)。
## $CRAN
## [1] "abind" "acepack" "ape"
## [4] "argon2" "arules" "ascii"
## [7] "askpass" "assertthat" "AUC"
## [10] "backports" "base64enc" "bench"
## [13] "Bessel" "biglm" "bindr"
## [16] "bindrcpp" "bit" "bit64"
## [19] "bitops" "blob" "bookdown"
## [22] "brew" "brio" "broom"
## [25] "bslib" "cachem" "Cairo"
## [28] "callr" "car" "caTools"
## [31] "cellranger" "chron" "cli"
## [34] "cliapp" "clipr" "clisymbols"
## [37] "coda" "colorspace" "combinat"
## [40] "commonmark" "conflicted" "corpus"
## [43] "covr" "cpp11" "crayon"
## [46] "credentials" "crosstalk" "curl"
## [49] "cyclocomp" "data.table" "date"
## [52] "DBI" "DBItest" "dbplyr"
## [55] "debugme" "deldir" "desc"
## [58] "devtools" "dichromat" "diffobj"
## [61] "digest" "disposables" "doMC"
## [64] "doParallel" "downlit" "dplyr"
## [67] "DT" "dtplyr" "ellipsis"
## [70] "errors" "evaluate" "expm"
## [73] "fansi" "farver" "fastmap"
## [76] "fastmatch" "filehash" "filelock"
## [79] "flexiblas" "FMStable" "foghorn"
## [82] "fontBitstreamVera" "fontLiberation" "forcats"
## [85] "foreach" "formatR" "formattable"
## [88] "fortunes" "fs" "futile.logger"
## [91] "futile.options" "future" "gamlss.dist"
## [94] "gapminder" "gargle" "gdata"
## [97] "gdtools" "gee" "geepack"
## [100] "generics" "gert" "getPass"
## [103] "ggplot2" "ggplot2movies" "gh"
## [106] "git2r" "gitcreds" "globals"
## [109] "glue" "gmailr" "gmp"
## [112] "gplots" "gsl" "gss"
## [115] "gtable" "gtools" "haven"
## [118] "here" "hexbin" "highlight"
## [121] "highr" "hms" "htmltools"
## [124] "htmlwidgets" "httpuv" "httr"
## [127] "hunspell" "igraph" "import"
## [130] "ini" "inline" "IRdisplay"
## [133] "IRkernel" "isoband" "iterators"
## [136] "itertools" "jose" "jpeg"
## [139] "jqr" "jquerylib" "jsonlite"
## [142] "keyring" "knitr" "labeling"
## [145] "lambda.r" "later" "lazyeval"
## [148] "lifecycle" "lintr" "listenv"
## [151] "littler" "lmodel2" "lmtest"
## [154] "lobstr" "lokern" "lpSolve"
## [157] "lubridate" "magick" "magrittr"
## [160] "mapproj" "maps" "mAr"
## [163] "markdown" "matrixStats" "measurements"
## [166] "memoise" "microbats" "microbenchmark"
## [169] "mime" "miniUI" "mlbench"
## [172] "mnormt" "mockery" "mockr"
## [175] "modelr" "msm" "multcomp"
## [178] "munsell" "mvtnorm" "nanotime"
## [181] "ncdf4" "NISTunits" "nycflights13"
## [184] "odbc" "openssl" "orcutt"
## [187] "oskeyring" "packrat" "pak"
## [190] "parallelly" "parsedate" "pbapply"
## [193] "pbdZMQ" "pdftools" "pillar"
## [196] "pingr" "pkgbuild" "pkgcache"
## [199] "pkgconfig" "pkgdown" "pkgload"
## [202] "plogr" "plyr" "png"
## [205] "poLCA" "polyclip" "polynom"
## [208] "praise" "presser" "prettycode"
## [211] "prettydoc" "prettyunits" "processx"
## [214] "procmaps" "profmem" "profvis"
## [217] "progress" "promises" "ps"
## [220] "purrr" "qcc" "qpdf"
## [223] "qtl" "quadprog" "quantities"
## [226] "R.cache" "R.devices" "R.methodsS3"
## [229] "R.oo" "R.rsp" "R.utils"
## [232] "R6" "ragg" "randomForest"
## [235] "rappdirs" "rcmdcheck" "RColorBrewer"
## [238] "Rcpp" "RcppCCTZ" "RcppDate"
## [241] "RCurl" "readr" "readxl"
## [244] "rematch" "rematch2" "remotes"
## [247] "repr" "reprex" "repurrrsive"
## [250] "reshape" "reshape2" "restfulr"
## [253] "reticulate" "rex" "rgdal"
## [256] "rgeos" "RhpcBLASctl" "rhub"
## [259] "RInside" "rjson" "rlang"
## [262] "rle" "rlecuyer" "RMariaDB"
## [265] "rmarkdown" "Rmpfr" "RODBC"
## [268] "roxygen2" "RPostgres" "rprintf"
## [271] "rprojroot" "rsconnect" "RSQLite"
## [274] "rstudioapi" "rsvg" "RUnit"
## [277] "rversions" "rvest" "sandwich"
## [280] "sass" "scales" "scatterplot3d"
## [283] "sciplot" "selectr" "servr"
## [286] "sessioninfo" "sfsmisc" "shiny"
## [289] "showtext" "showtextdb" "simmer"
## [292] "snow" "sodium" "sourcetools"
## [295] "sp" "spelling" "statnet.common"
## [298] "stringdist" "stringi" "stringr"
## [301] "styler" "svglite" "sys"
## [304] "sysfonts" "systemfit" "systemfonts"
## [307] "tesseract" "testit" "testthat"
## [310] "textshaping" "TH.data" "tibble"
## [313] "tidyr" "tidyselect" "tikzDevice"
## [316] "timeDate" "timeSeries" "tinytest"
## [319] "tinytex" "tkrplot" "tmvnsim"
## [322] "tufte" "tweenr" "udunits2"
## [325] "unitizer" "units" "unix"
## [328] "usethis" "utf8" "uuid"
## [331] "V8" "vcd" "vctrs"
## [334] "viridisLite" "waldo" "waveslim"
## [337] "wavethresh" "webfakes" "webp"
## [340] "websocket" "webutils" "wesanderson"
## [343] "whisker" "whoami" "winch"
## [346] "withr" "xfun" "XML"
## [349] "xml2" "xmlparsedata" "xopen"
## [352] "xtable" "yaml" "zeallot"
## [355] "zip" "zoo"
##
## $`BioC software`
## [1] "affyio" "AnnotationDbi" "Biobase"
## [4] "BiocFileCache" "BiocGenerics" "BiocIO"
## [7] "BiocParallel" "biomaRt" "Biostrings"
## [10] "BSgenome" "BufferedMatrix" "DelayedArray"
## [13] "DynDoc" "GenomeInfoDb" "GenomicAlignments"
## [16] "GenomicRanges" "IRanges" "KEGGREST"
## [19] "MatrixGenerics" "preprocessCore" "qvalue"
## [22] "Rhtslib" "Rsamtools" "rtracklayer"
## [25] "S4Vectors" "SummarizedExperiment" "tkWidgets"
## [28] "widgetTools" "XVector"
##
## $`BioC annotation`
## [1] "GenomeInfoDbData"
##
## $`R-Forge`
## [1] "abind" "Bessel" "bit" "bit64"
## [5] "brew" "car" "colorspace" "data.table"
## [9] "date" "dichromat" "digest" "doMC"
## [13] "doParallel" "expm" "foreach" "fortunes"
## [17] "gamlss.dist" "gdata" "gplots" "gtools"
## [21] "highlight" "htmltools" "iterators" "itertools"
## [25] "labeling" "lmodel2" "lokern" "matrixStats"
## [29] "msm" "multcomp" "mvtnorm" "NISTunits"
## [33] "pbapply" "randomForest" "Rcpp" "rgdal"
## [37] "rgeos" "Rmpfr" "sandwich" "scatterplot3d"
## [41] "stringi" "systemfit" "TH.data" "tikzDevice"
## [45] "timeDate" "timeSeries" "vcd" "waveslim"
## [49] "xtable" "zoo"
##
## $rforge.net
## [1] "Cairo" "base64enc" "brew" "evaluate" "fastmatch"
## [6] "formatR" "highr" "jpeg" "knitr" "markdown"
## [11] "mime" "png" "servr" "testit" "tikzDevice"
## [16] "uuid"
##
## $Other
## [1] "RM2" "Rcompression" "Rsolid" "fts" "nws"
## [6] "pbdRPC"
请注意,分类不是互斥的(例如,R-RCurl 出现多次),并且有一些 RPM 不来自任何标准 R 仓库。这些列在“其他”下。
cran2copr 项目为当前和之前的稳定 Fedora 版本维护了大多数 CRAN(截至 2022 年 5 月超过 18k 个软件包)的二进制 RPM 仓库,使用 Fedora Copr 以自动方式进行。
这些仓库每天通过 GitHub Action 在 UTC 时间 00:00 自动与 CRAN 同步,该 Action 会删除存档的软件包并构建最新的更新。为了确保与官方仓库的兼容性,这些软件包集被命名为“R-CRAN-pkgname”(而不是“R-pkgname”),并安装到 /usr/local/lib/R/library
中。
要在您的系统中启用此 Copr 仓库
$ sudo dnf install 'dnf-command(copr)'
$ sudo dnf copr enable iucar/cran
$ sudo dnf install R-CoprManager
最后一个命令是可选的,但建议使用,因为 CoprManager 软件包将二进制软件包安装集成到您的 R 会话中。这样,您就可以像往常一样在 R 中安装或更新软件包,例如
install.packages("car")
update.packages(ask=FALSE)
在 R 控制台中,软件包将自动从 Copr 仓库安装。如果软件包不可用,则它会回退到从 CRAN 进行正常安装。
另一方面,remove.packages
仍然只会删除您用户库中安装的软件包。如果您想删除系统软件包,请运行
CoprManager::remove_copr("car")
如果您想禁用 CoprManager,以便 install.packages
再次仅与 CRAN 一起使用,请运行
CoprManager::disable()
install.packages("car") # from CRAN to user lib
从 Fedora 33 开始,R(以及 Numpy、Octave 和所有其他 BLAS/LAPACK 消费者)链接到 FlexiBLAS,这是一个 BLAS/LAPACK 包装库,它允许在运行时切换优化的后端(有关更多详细信息,请参阅 更改建议),并且 OpenBLAS 的 OpenMP 版本被设置为默认后端。
附带的 flexiblas
R 包允许在不退出 R 会话的情况下切换 BLAS/LAPACK,以及设置并行后端的线程数(有关更多信息,请参阅该包的 README)。
$ sudo dnf install R-flexiblas # install FlexiBLAS API interface for R
$ sudo dnf install flexiblas-* # install all available optimized backends
然后,在 R 会话中,我们看到
library(flexiblas)
# check whether FlexiBLAS is available
flexiblas_avail()
#> [1] TRUE
# get the current backend
flexiblas_current_backend()
#> [1] "OPENBLAS-OPENMP"
# list all available backends
flexiblas_list()
#> [1] "NETLIB" "__FALLBACK__" "BLIS-THREADS" "OPENBLAS-OPENMP"
#> [5] "BLIS-SERIAL" "ATLAS" "OPENBLAS-SERIAL" "OPENBLAS-THREADS"
#> [9] "BLIS-OPENMP"
# get/set the number of threads
flexiblas_set_num_threads(12)
flexiblas_get_num_threads()
#> [1] 12
这是一个针对所有可用后端的 GEMM 基准测试示例
library(flexiblas)
n <- 2000
runs <- 10
ignore <- "__FALLBACK__"
A <- matrix(runif(n*n), nrow=n)
B <- matrix(runif(n*n), nrow=n)
# load backends
backends <- setdiff(flexiblas_list(), ignore)
idx <- flexiblas_load_backend(backends)
# benchmark
timings <- sapply(idx, function(i) {
flexiblas_switch(i)
# warm-up
C <- A[1:100, 1:100] %*% B[1:100, 1:100]
unname(system.time({
for (j in seq_len(runs))
C <- A %*% B
})[3])
})
results <- data.frame(
backend = backends,
`timing [s]` = timings,
`performance [GFlops]` = (2 * (n / 1000)^3) / timings,
check.names = FALSE)
results[order(results$performance),]
#> backend timing [s] performance [GFlops]
#> 1 NETLIB 56.776 0.2818092
#> 5 ATLAS 5.988 2.6720107
#> 2 BLIS-THREADS 3.442 4.6484602
#> 8 BLIS-OPENMP 3.408 4.6948357
#> 4 BLIS-SERIAL 3.395 4.7128130
#> 6 OPENBLAS-SERIAL 3.206 4.9906425
#> 7 OPENBLAS-THREADS 0.773 20.6985770
#> 3 OPENBLAS-OPENMP 0.761 21.0249671
以下附加组件在官方存储库中可用
组件 | 描述 |
---|---|
rstudio-desktop | R 语言的集成开发环境 |
rstudio-server | 通过 Web 浏览器访问 RStudio |
rkward | R 语言的图形前端 |
emacs-ess | GNU Emacs 下的 Emacs Speaks Statistics |
有 官方 Fedora Docker 镜像,由 Fedora 发布工程团队维护,可作为容器化 R 应用程序(用于云部署、CI/CD 系统等)的基础镜像。上述所有说明也适用于在这些 Docker 镜像中安装和维护 R 软件。但是,您可能会在从源代码安装 R 包时看到以下警告
Warning in file.create(f.tg) :
cannot create file '/usr/share/doc/R/html/packages.html', reason 'No
such file or directory'
Warning in utils::make.packages.html(.Library, docdir = R.home("doc")) :
cannot update HTML package index
这是预期的,因为基本 Docker 镜像将 tsflags=nodocs
添加到 /etc/dnf/dnf.conf
以最小化镜像大小,因此 R 安装中缺少一些文档。但是,**此警告完全无害,可以安全地忽略**。如果您仍然想消除此警告,有两个选择
--setopt=tsflags=
安装 R-core 将重置 tsflags
,从而安装 R 的文档。--no-docs
安装源 R 包不会发出任何警告。如果您使用的是旧版本的 devtools
或 remotes
来安装 R 包,则上述警告可能会变成以下错误
Error in file.copy(file.path(R.home("doc"), "html", "R.css"), outman) :
(converted from warning) problem copying /usr/share/doc/R/html/R.css
to /usr/lib64/R/library/00LOCK-<package>/00new/<package>/html/R.css:
No such file or directory
这是一个 已知问题,应该在最近的版本中修复。否则,设置环境变量 R_REMOTES_NO_ERRORS_FROM_WARNINGS=true
应该可以避免将安装警告变成错误。
Toolbox 为日常软件开发提供了一个无根容器化环境。它最适合不可变操作系统,例如 Fedora Silverblue,但它可以在任何 Fedora 或 CentOS/RedHat 基本系统中使用。它可以用作主要开发环境,以避免在基本系统中安装任何东西,或者例如,仅在 Fedora rawhide 中测试新的 R 版本,而不会污染主安装。
例如,假设基础系统运行 Fedora 34 上的 R 4.0,并且我们希望在 Fedora 35 发布之前测试 rawhide 中可用的 R 4.1。
$ sudo dnf install toolbox
$ toolbox enter --release 35
[toolbox]$ sudo dnf install R
[toolbox]$ R
R version 4.1.0 (2021-05-18) -- "Camp Pontanezen"
Copyright (C) 2021 The R Foundation for Statistical Computing
Platform: x86_64-redhat-linux-gnu (64-bit)
请注意,用户无需任何管理权限即可在工具箱中安装任何内容。一旦 R 安装在工具箱中,就可以直接执行,无需先进入。
$ toolbox run --release 35 R
为了连接到那里的 R 安装,您喜欢的 IDE 也必须安装在工具箱中。RStudio Desktop 等 GUI 应该可以直接使用。
[toolbox]$ sudo dnf install rstudio-desktop
[toolbox]$ rstudio
但是,如果您遇到空白屏幕或界面故障,可以使用以下方法解决问题:使用服务器版本。
[toolbox]$ sudo dnf install rstudio-server
[toolbox]$ sudo rserver --server-user=$(whoami) --verify-installation=1
[toolbox]$ rserver --server-user=$(whoami)
然后,打开任何 Web 浏览器并导航到 localhost:8787
。
有关 Fedora 上的工具箱的更多信息,请参阅 此介绍 以及文档 (man toolbox
)。
感谢 Martyn Plummer 维持此页面的先前版本。Fedora/EPEL 的 R 堆栈由 Tom “Spot” Callaway、Elliott Sales de Andrade、José Abílio Matos 和 Mattias Ellert 等人维护。Fedora 的其他 CRAN RPM 由 Iñaki Ucar 维护,通过 Fedora Copr 构建和分发。Copr 构建系统由 Miroslav Suchý、Pavel Raiskup、Jakub Kadlcik 和许多其他人维护。感谢 Martin Koehler 和 Fabio Valentini 在将 FlexiBLAS 引入 Fedora 中提供的宝贵帮助。