安装

Fedora

要安装最新的 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” 元包。

CentOS 和 RHEL 的 EPEL

R 的 Fedora RPM 已由 企业 Linux 附加软件包 (EPEL) 项目移植到 CentOS/RHEL。这些 RPM 也与从 CentOS/RHEL 派生的发行版兼容。

要使用 EPEL 仓库,只需下载并安装相应的 “epel-release” RPM,如 EPEL 常见问题解答中所述。然后,可以按照上述方法安装 R。

管理和维护

R 安装分为两个目录

同样,

此外,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

BLAS/LAPACK 切换

从 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 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 包不会发出任何警告。

如果您使用的是旧版本的 devtoolsremotes 来安装 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 中提供的宝贵帮助。