重新整理了一篇在 Linux 环境中安装 R/RStudio Server 及 R 包,使用 R 连接数据库的笔记。
上个月在服务器上跑模型的时候一不小心把内存占满了,还好没产生什么别的影响。但因祸得福,这件事使好领导想起来有台配置更好的服务器可以给我用。本来好领导打算自己动手帮忙装 R 的,不过我坚持要练练手,于是好领导给我配了一个没有 root 权限的账号让我自己折腾去。因为之前在其他服务器上装 R/RStudio Server 及 R 包都有记笔记,这次想顺便整理一个完整版。不过由于缺乏一些基础常识,断断续续折腾了两三天把 R/RStudio Server 和一些 R 包都装到了 home 目录下……由于装 xgboost 和 glmnet 包都需要升级 gcc,这一步我没成功,后来还是好领导替我换了个目录重新装了 R、升级 gcc 以及装了那两个包。
正式开始前,先了解下环境信息,登录服务器,执行uname -a
、cat /proc/version
等查看 Linux 版本。
-
基本环境:Linux version 3.10.0-1062.el7.x86_64(gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) )
-
安装条件:离线安装。服务器有防火墙,不能联外网,也需要申请具体端口访问权限,所以这篇笔记里没有任何与设置防火墙相关的内容。
-
默认规则:服务器上的 home 目录相当于 windows 系统的 c 盘,一般不要把软件装在 home 目录下。
本次安装时,由于缺乏经验,下文中各种文件目录被弄得不够统一、较复杂,于是正文中每次涉及文件目录时都会不厌其烦地详细叨一遍。
1.安装 R 🔗
在 CRAN 上下载最新的 R 源码文件压缩包(R-4.2.2.tar.gz),传到服务器上。
1.1.基本步骤 🔗
以下仅仅只是编译安装 R 的基本步骤,一般都会在编译那一步报很多错,踩不少坑。若是想要一次编译成功,且对后续装 R 包没影响,需要把后两个小节中显性坑、隐性坑里提到的 Linux 包都在编译之前装好。但是不同环境会导致报的错不同,离线安装还是需要做好趟坑的心理准备。
#! 切换到压缩包所在目录
cd /home/model/R/
#! 解压,完成后会生成一个新的 R-4.2.2文件夹,里面就是解压后的文件
tar -zxvf R-4.2.2.tar.gz
#! 切换到 R-4.2.2文件夹下面
cd R-4.2.2/
#! 编译,指定安装目录
./configure --prefix='/home/model/R/R-4.2.2/' --enable-R-shlib=yes --with-readline=yes --with-libpng=yes --with-x=yes --with-blas --with-tcltk --with-pcre1
#! 安装
make
make install
需要说明的是:
-
--enable-R-shlib=yes
表示生成 libR.so 库,不加这段的话后面装 Rstudio-server 会缺少 libR.so,会报错“R shared library (…/R-4.0.3/lib64/R/lib/libR.so) not found. If this is a custom build of R, was it built with the –enable-R-shlib option?”。 -
编译代码后面跟的一长串,是笔者装了好几次 R 和 RStudio Server 后,试错试出来的。换个新的服务器重新再装一次的话,还是会因为环境变了而出现新的问题。这里有一篇文章列举了在编译步骤之前应先安装的必备包,以后再有机会的话倒是可以试试看,看看是不是可以一口气跳过所有坑。
1.2.显性坑(编译失败) 🔗
若编译时报错,大多是因为服务器系统环境中没有安装某些 Linux 包,需要根据报错信息一一安装。
configure: error: –with-readline=yes (default) and headers/libs are not available
sudo yum install readline-devel
configure: error: –with-x=yes (default) and X11 headers/libs are not available
sudo yum install libXt-devel
configure: error: zlib library and headers are required
sudo yum install zlib-devel
configure: error: bzip2 library and headers are required
sudo yum install bzip2-devel
configure: error: “liblzma library and headers are required”
sudo yum install lzma xz-devel
configure: error: PCRE2 library and headers are required, or use –with-pcre1 and PCRE >= 8.32 with UTF-8 support
上次在别的服务器上装 R 时,缺少 PCRE2 只需要执行sudo yum install pcre2-devel libcurl-devel
即可。但是刚好新服务器上没有 pcre2-devel,于是摸索着做了以下尝试。
-
1.参考网上搜的文章,下载 pcre2-10.39.tar.bz2,安装以后编译 R 报一样的错,失败。这是因为需要的是 pcre2-devel 而不是 pcre2。
-
2.找到官网,下载 pcre2-devel-10.23-2.el7.x86_64.rpm,安装pcre2-devel 时报错说缺少
pcre2-utf32(x86-64) = 10.23-2.el7
和libpcre2-32.so.0()(64bit)
。 -
3.下载pcre2-utf32-10.23-2.el7.x86_64.rpm,安装完成,没报错。继续安装 pcre2-devel,也没报错。
继续执行之前的编译代码,没有报错,于是继续安装直至完成。安装好以后,执行cd /home/model/R/R-4.2.2/bin/
到对应目录下,再执行./R
运行 R,验证 R 是否正常安装成功。
1.3.隐性坑(重新编译 R) 🔗
在之前编译完成后会出现下面这段,可能会提示出一些隐藏的坑。
-
- Capabilities skipped: PNG, JPEG, TIFF, cairo, ICU 表示在 Linux 上使用 R 时不支持绘制这些图形形式,将来用 ggplot2 以及依赖 ggplot2 的包绘图会报错。
-
- C++14 compiler 后面是空的,表示系统环境暂不支持 C++14,将来装 xgboost、glmnet 包时会报错。
-
- 没有提示缺少 Java 开发工具包(JDK),将来装 rJava、RJDBC 包时会报错。
R is now configured for x86_64-pc-linux-gnu
Source directory: .
Installation directory: /home/model/R/R-4.2.2
C compiler: gcc -std=gnu11 -g -O2
Fortran fixed-form compiler: gfortran -g -O2
Default C++ compiler: g++ -std=gnu++11 -g -O2
C++11 compiler: g++ -std=gnu++11 -g -O2
C++14 compiler:
C++17 compiler:
C++20 compiler:
Fortran free-form compiler: gfortran -g -O2
Obj-C compiler:
Interfaces supported: X11
External libraries: pcre2, readline, curl
Additional capabilities: NLS
Options enabled: shared R library, shared BLAS, R profiling
Capabilities skipped: PNG, JPEG, TIFF, cairo, ICU
Options not enabled: memory profiling
Recommended packages: yes
configure: WARNING: you cannot build info or HTML versions of the R manuals
configure: WARNING: you cannot build PDF versions of the R manuals
configure: WARNING: you cannot build PDF versions of vignettes and help pages
打开 R,在 R 中输入capabilities()
可以得到下面这段,也是说明缺少一些支持。
>capabilities()
jpeg png tiff tcltk X11 aqua
FALSE FALSE FALSE FALSE FALSE FALSE
http/ftp sockets libxml fifo cledit iconv
TRUE TRUE FALSE TRUE TRUE TRUE
NLS Rprof profmem cairo ICU long.double
TRUE TRUE FALSE FALSE FALSE TRUE
libcurl
TRUE
由于是系统环境问题,需要重新编译 R ,在此之前先安装一些相关的包,如下。
sudo yum install libpng libpng-devel libtiff libtiff-devel libjpeg-turbo libjpeg-turbo-devel cairo cairo-devel libicu-devel
如果Linux 环境中没有安装 libicu-devel,后面在 R 中安装 stringi 包时会报错,依赖 stringi 的包都会安装失败。
如果 Linux 环境中没有安装 cairo,后面在 R 中可能会无法安装 Cairo 包,依赖 ggplot2 的 scorecard 包绘图时会报错。
如果需要支持 C++14编译器或更高版本,此时需要升级 gcc。
重新编译的步骤和第1.1小节中的基本步骤是一样的。为了避免混淆,在别的目录下再次解压 R-4.2.2.tar.gz,但是编译代码可以不用改,因为重新编译可以覆盖之前的,继续把 R 安装到之前的目录下面即可。编译完成后会看到“ Additional capabilities: PNG, JPEG, TIFF, NLS, cairo, ICU”,接着继续执行 make && make install
即可。
2.安装 Rstudio Server 🔗
上官网下载 Rstudio Server的 rpm 文件,上传到服务器。
#! 安装 RStudio Server
sudo yum localinstall rstudio-server-rhel-1.4.1717-x86_64.rpm
#! 查看端口有无被占用
netstat -nat|grep 8888
:'
#添加跟端口配置相关的文件
#修改文件:vi
#文件中插入内容:按I键
#保存并退出: 按下Esc键 + :wq
#不保存退出: 按下Esc键 + :q!
'
sudo vi /etc/rstudio/rserver.conf
:'
#! 在 rserver.conf 文件中增加下面两行
第一行指定 R 程序所在位置
第二行指定端口号
'
rsession-which-r=/home/model/R/R-4.2.2/bin/R
www-port=8888
#! 检查配置是否完整
sudo rstudio-server verify-installation
#! 启动服务
sudo rstudio-server start
#! 查看状态,当出现 active(激活) 时,配置完成
sudo rstudio-server status
#! 重启服务
sudo rstudio-server restart
#! 关闭服务
sudo rstudio-server stop
启动服务后,在浏览器地址中输入IP:8888
就会看到 RStudio Server 的登录界面,账户密码就是登录服务器的账户密码。
在检查配置是否完整时,报了下面的错,可能是因为没有配置 rsession.conf 文件,但是并不影响使用,可以忽略。
TTY detected. Printing informational message about logging configuration. Logging configuration loaded from ‘/etc/rstudio/logging.conf’. Logging to ‘/var/log/rstudio/rstudio-server/rserver.log’.
/usr/lib/rstudio-server/bin/rsession: error while loading shared libraries: libR.so: cannot open shared object file: No such file or directory
3.安装 R 包 🔗
本次仅安装以下 R 包:
- markdown/rmarkdown
- Cairo:用于部分图形输出
- DBI/rJava/RJDBC:用于连接 Oracle、hive 等数据库
- data.table:数据处理
- echarts4r:绘制图形
- DT:绘制表格
- scorecard/bigstep/glmnet:计算 IV 值、分箱、绘制 ROC/K-S 曲线、逐步回归、交叉验证等
- xgboost:训练 XGBoost 模型
在安装以上 R 包时,也会顺带装好一系列依赖包,比如 stringi、stringr、dplyr、ggplot2、shiny 等。
3.1.基本步骤 🔗
由于服务器上不能联外网,所以和安装 R、RStudio Server 一样,也需要先在能联外网的本地下载好需要安装的 R 源码包,并把下载的一系列文件都传到服务器上。在本地下载各种包和依赖包的代码如下。
getPackages <- function(packs) {
packages <- unlist(
tools::package_dependencies(
packs,
available.packages(),
which = c("Depends", "Imports", "LinkingTo"),
recursive = TRUE
)
)
packages <- union(packs, packages)
packages
}
#这里写入需要下载的包的名字
myPackages <-
c("evaluate", "highr", "knitr", "markdown", "rmarkdown", "tinytex","xfun")
# myPackages <-
# c("Cairo","data.table","echarts4r","DT","scorecard","xgboost","openxlsx","DBI","rJava","RJDBC")
# myPackages <-
# c("bigstep","glmnet","dplyr","ggplot2")
packages <- getPackages(myPackages)
# 指定下载下来的包的存放目录
download.packages(packages, destdir = "D:/R/installR", type = "source")
接下来准备一个批量安装 R 包的脚本文件 install_Rpkg.R,传到服务器上,存放路径是/home/model/R/R_scripts/install_Rpkg.R
,而当前 R 程序所在路径是/home/model/R/R-4.2.2/bin/R
,那么可执行下面两行代码调用 install_Rpkg.R 脚本来安装R包。在 Linux 环境下cd ..
是返回上一级目录的意思,下面目录切换的有点麻烦,其实可以不这么麻烦的。
#!切换到 install_Rpkg.R 所在目录
cd /home/model/R/R_scripts/
#! 再切换目录执行 R 脚本,多个 R 包名称之间用空格隔开
../R-4.2.2/bin/Rscript install_Rpkg.R evaluate highr knitr markdown rmarkdown tinytex xfun
其中,install_Rpkg.R 中的内容如下。
library(tools)
myPackages = commandArgs(T)
if (length(myPackages) == 0) {
cat("Usage: Rscript install_Rpkg.R package1 package2 package3 ...")
cat("\n")
quit("no")
}
# 填入 R 安装包在服务器上的路径
path <- "/home/model/installR/pkg"
write_PACKAGES(path, type = "source")
install.packages(myPackages,
contriburl = paste("file:", path, sep = ''),
type = "source")
以上是批量安装 R 包的方法,以下是单独安装 R 包的方法。
- 方法一,继续调用 install_Rpkg.R,如下安装 cpp11 包。
#!切换到 install_Rpkg.R 所在目录
cd /home/model/R/R_scripts/
#! 再切换目录执行 R 脚本
../R-4.2.2/bin/Rscript install_Rpkg.R cpp11
- 方法二,调用 R 程序,将 R 包安装到 R 的 library 目录下,如下安装 sodium 1.2.0。
#! 切换到 R 程序所在目录
cd /home/model/R/R-4.2.2/bin/
#!
./R CMD INSTALL -l /home/model/R-4.2.2/lib64/R/library /home/model/installR/pkg/sodium_1.2.0.tar.gz
- 方法三,打开 RStudio Server,在 R 里面用 install.packages 函数安装 R 包,如下安装 sass 0.4.3。
install.packages("home/model/installR/pkg/sass_0.4.3.tar.gz", repos = NULL, type = "source")
3.2.安装 R 包踩的坑 🔗
安装过程中,如果出现 “had non-zero exit status” 错误或者版本对不上的错误,可以查一下包之间的依赖关系,可以试试版本低一点的包是否能正常安装。
- 单个包下载路径:https://cran.r-project.org/src/contrib/Archive/ 。
- 包依赖查询路径:比如查’data.table’包,就是https://cran.r-project.org/web/packages/data.table/。
- R 语言源码包:比如查 R3.X 版本,就是https://cran.r-project.org/src/base/R-3/,查 R4.X 版本,就是https://cran.r-project.org/src/base/R-4/。
安装 stringi 包 🔗
downloading the ICU data library (icudt)
trying URL ‘http://raw.githubusercontent.com/gagolews/stringi/master/src/icu69/data/icu4c-69_1-data-bin-l.zip'
Error in download.file(paste(href, fname, sep = “”), icudtzipfname, mode = “wb”): cannot open URL ‘http://raw.githubusercontent.com/gagolews/stringi/master/src/icu69/data/icu4c-69_1-data-bin-l.zip'
icudt download failed.stringi cannot be built.Failed to download the ICU data library (icudt). Stopping now.
安装 stringi 包时报了上面的错,这是因为开发者默认安装这个包时要从镜像上下载 ICU 相关的包,于是离线安装时一定会报错。从https://github.com/gagolews/stringi/blob/master/INSTALL这里翻了翻,最终解决方法如下:
-
1.根据报错信息下载 icu4c-69_1-data-bin-l.zip,和之前下载好的 stringi_1.7.8.tar.gz 放到同一路径下
/home/model/installR/pkg
。 -
2.在已经安装好的 Rstudio Server 中执行以下代码。
install.packages("/home/model/installR/pkg/stringi_1.7.8.tar.gz", repos = NULL, type = "source",configure.vars="ICUDT_DIR=/home/model/installR/pkg")
安装 sass/bslib 包 🔗
安装 rmarkdown 包的时候报错,因为其依赖包 sass 和 bslib 安装失败。报的错误如下,大意是文件不完整。
Error in untar2(tarfile, files, list, exdir, restore_times) :incomplete block on file
原先安装失败的是 sass 0.4.4,在 CRAN 上重新下载sass 0.4.3后,重新安装成功了。同理,原先装 bslib 0.4.1失败,重新下载 bslib 0.4.0再安装也成功了。随后重新安装 rmarkdown 也正常了。
install.packages("home/model/installR/pkg/sass_0.4.3.tar.gz", repos = NULL, type = "source")
install.packages("home/model/installR/pkg/bslib_0.4.0.tar.gz", repos = NULL, type = "source")
安装 echarts4r 包 🔗
Warning: dependency ‘cpp11’ is not available
also installing the dependencies ‘tidyr’, ‘httpuv’, ‘broom’, ‘shiny’, ‘corrplot’
ERROR: dependency ‘cpp11’ is not available for package ‘tidyr’
* removing ‘/home/model/R/R-4.2.2/lib64/R/library/tidyr’
Error in untar2(tarfile, files, list, exdir, restore_times) :
incomplete block on file
Error in untar2(tarfile, files, list, exdir, restore_times) :
incomplete block on file
ERROR: dependency ‘tidyr’ is not available for package ‘broom’
* removing ‘/home/model/R/R-4.2.2/lib64/R/library/broom’
ERROR: dependency ‘httpuv’ is not available for package ‘shiny’
* removing ‘/home/model/R/R-4.2.2/lib64/R/library/shiny’
ERROR: dependencies ‘broom’, ‘shiny’, ‘corrplot’ are not available for package ‘echarts4r’
这个错误里有好几条依赖关系。
-
一是缺少 cpp11,于是依赖 cpp11 的 tidyr 安装失败,而依赖 tidyr 的 broom 也安装失败。上 CRAN 下载 cpp11重新安装,完成后依次安装 tidyr 、broom 即可。
-
二是 httpuv 文件不完整,于是依赖 httpuv 的 shiny 安装失败。原先报错的是 httpuv1.6.6,于是上 CRAN 下载 httpuv1.6.5,重新安装成功。接着,shiny 也能正常安装完成。
-
三是 echarts4r 直接依赖的 corrplot 安装失败,单独安装后发现报错原因也是文件不完整。原先报错的是 corrplot0.92,于是上 CRAN 下载 corrplot0.91,重新安装成功。
以上几个依赖包都安装完成后,echarts4r 就能安装成功了。
安装 rJava/RJDBC 包 🔗
configure: error: Java Development Kit (JDK) is missing or not registered in R
ERROR: configuration failed for package ‘rJava’
错误显示系统环境中缺少 Java 开发工具包(JDK),于是 rJava 安装失败,而依赖 rJava 的 RJDBC 也安装失败。系统环境的原因同样需要在装好新的 JDK 后重新编译R。参照网上搜的文章找找系统里有没有现成的文件可以直接装,没有的话需要去官网下载一个再安装。
sudo yum -y list java*
sudo yum install -y java-1.8.0-openjdk.x86_64
#!
java -version
安装 glmnet/xgboost 包 🔗
安装 glmnet 和 xgboost 时都报了一样的错,如下。
Error: C++14 standard requested but CXX14 is not defined
C++14 需要 gcc 6.1 以上才完全支持,所以需要暂时升级 gcc。如果不想影响系统环境的话,升级完 gcc、装好 R 包后还要还原回去。大体步骤是:升级gcc–->重新编译安装 R–->装 R 包–->还原 gcc。
如果有 root 权限的话,可以直接装到根目录下,下面的步骤可能好使。不然的话,在编译的步骤需要加上--prefix='/指定目录/'
装到指定目录。
-
1.从https://ftp.gnu.org/gnu/gcc/这里下载 gcc-6.1.0-tar.gz,打开后在
\gcc-6.1.0 .tar.gz\gcc-6.1.0 .tar\gcc-6.1.0\contrib\
路径下找到 download_prerequisites 文件,用文本编辑器打开这个文件,可以看到 gcc6.1.0 所需依赖包及对应版本。接着分别下载mpfr-2.4.2 、gmp-4.3.2、 mpc-0.8.1。最后将四个文件都传到服务器上。 -
2.依次解压,编译安装 gcc。
#! cd 到存放压缩包的目录
cd /存放目录
#!依次解压到指定目录,依赖包需解压到 gcc-6.1.0文件夹下
tar -zvxf gcc-6.1.0.tar.gz --directory=/指定目录/
tar -xf gmp-4.3.2.tar.bz2 --directory=/指定目录/gcc-6.1.0/
tar -xf mpc-0.8.1.tar.gz --directory=/指定目录/gcc-6.1.0/
tar -xf mpfr-2.4.2.tar.bz2 --directory=/指定目录/gcc-6.1.0/
#! 切换目录
cd /指定目录/gcc-6.1.0
ln -sf gmp-4.3.2 gmp
ln -sf mpfr-2.4.2 mpfr
ln -sf mpc-0.8.1 mpc
# 创建 build 目录
mkdir build && cd build
# 编译
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
# 执行安装(约2小时)
make && make install
# 查看 gcc 版本
gcc -v
4.使用 R 连接数据库 🔗
连接数据库之前,要做几项准备工作。
-
1.需要确保 RJDBC 包安装成功,能正常加载。
-
2.准备适配的 jar 包。一般使用 RJDBC 包连接数据库都会需要有 JDBC 驱动的 jar 包,下载下来后传到 R 的工作目录中。可在 RStudio Server 使用
getwd()
函数查看工作目录,使用setwd("")
函数指定工作目录。
如果是连接 Oracle 数据库,需要找与数据库版本对应的 ojdbc 的 jar 包。
Oracle Database version | JDBC specification compliance |
---|---|
19.x | JDBC 4.3 in ojdbc10.jar/JDBC 4.2 in ojdbc8.jar |
18.3 | JDBC 4.2 in ojdbc8.jar |
12.2 or 12cR2 | JDBC 4.2 in ojdbc8.jar |
12.1 or 12cR1 | JDBC 4.1 in ojdbc7.jar/JDBC 4.0 in ojdbc6.jar |
11.2 or 11gR2 | JDBC 4.0 in ojdbc6.jar/JDBC 3.0 in ojdbc5.jar |
如果是连接 Hive/Impala,登录服务器后输入$ hadoop version
查看 Hadoop 版本,在弹出来的信息最下面一条就是 jar 包文件所在目录。
This command was run using /home/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/jars/hadoop-common-3.0.0-cdh6.3.2.jar
- 3.知晓数据库的 IP、端口号、账户、密码。
连接 Oracle 🔗
如果要导入的数据本身特别大,大到超过 Java 内存空间,会报错。在加载包之前运行条件options(java.parameters = "-Xmx1024m")
,可改变数据能占用的 Java 内存空间大小,1024m 是1G。如果1024m(1G)不够的话,可以再改大点,比如改成8192m(8G)。
options(java.parameters = "-Xmx1024m")
library(DBI)
library(rJava)
library(RJDBC)
drv <-
JDBC("oracle.jdbc.driver.OracleDriver",
"/工作目录/ojdbc6-11.2.0.1.0.jar")
conn <-
dbConnect(drv,
"jdbc:oracle:thin:@IP地址:端口:数据库名称",
"账户名称",
"密码")
# 举个例子,将表 temp_2022 导入 R 环境中
data = dbGetQuery(conn, "select * from temp_2022")
#相当于在数据库中执行 truncate table temp_2022;
#dbRemoveTable(conn, "temp_2022")
#相当于把 R 环境中的 data 数据集写入数据库的 temp_2023 表中
#dbWriteTable(conn, "temp_2023", data, overwrite = TRUE)
# 断开连接
dbDisconnect(conn)
连接 Impala 🔗
从https://docs.cloudera.com/documentation/enterprise/5-12-x/topics/impala_jdbc.html#jdbc_connect__class_hive_driver这里翻到了使用 Hive JDBC 驱动时默认端口号是21050。
options(java.parameters = "-Xmx8192m")
library(DBI)
library(rJava)
library(RJDBC)
#使用 Hive JDBC 驱动
drv <-
JDBC(
"org.apache.hive.jdbc.HiveDriver",
"/工作目录/hive-jdbc-2.1.1-cdh6.3.2-standalone.jar"
) #jar包所在目录
conn <-
dbConnect(drv,
"jdbc:hive2://IP:21050/;auth=noSasl", #填IP地址,端口号默认填21050
"xxx", #账户名
"XXX") #密码
# 导入数据
touch <- dbGetQuery(conn, "select * from kudu.temp_2022")
dbDisconnect(conn) #断开连接
连接 Impala 时会报下面这个错,但是数据能正常导入,并不影响使用,所以忽略没管。
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. Set system property ‘org.apache.logging.log4j.simplelog.StatusLogger.level’ to TRACE to show Log4j2 internal initialization logging.
5.使用 R Markdown 及绘图 🔗
在 RStudio Server中新建一个 R Markdown 文档,直接载入 echarts4r、DT 包后画图画表都是正常的,点击 knit 生成的 html 文档里图表也都是正常显示的。但是使用 ggplot2,以及依赖 ggplot2 的 scorecard 包绘图时会报出如下错误。
Error in .External2(C_X11, paste0(“png::”, filename), g$width, g$height, :unable to start device PNG
不知道 C_X11 和 X11 是什么关系,前面 R 编译完成后确实仅显示 Interfaces supported:X11,可能又是系统环境里缺乏些什么支持,需要装一些系统包然后重新编译 R 才管用,总之是一个没趟平的隐形坑。
现阶段的解决办法是,编译 R 之前执行sudo yum install cairo-devel
,装好 R 后,在 R 里安装 Cairo 包。
- 如果是想要 knit 生成的 html 文档里显示图形,需要在 R Markdown 文档的 setup 代码段里加上
dev = "CairoPNG"
参数。
```{r setup, include=TRUE,dev="CairoPNG"}
knitr::opts_chunk$set(echo = TRUE,dev="CairoPNG")
```
- 如果是想要在绘图过程中查看图片,需要在画图的代码前后加上下面这段,将绘制的图形保存成图片,通过打开图片来查看图形。
library(Cairo)
Cairo(
file = "Cairo_PNG_train_dpi.png", #生成图片的名字
type = "png", # 生成图片的格式
width = 1200, # 设置图片的宽度和高度
height = 800)
# 画图的代码
dev.off()