信创电脑R语言踩坑记录

瞿伟斌

2025/02/08

信创电脑R语言踩坑记录

作为统计分析人,拿到信创电脑的第一件事就是安装办公工具。配发的信创电脑是华为擎云,CPU为ARM架构的麒麟芯片,操作系统则是银河麒麟。 经过一番摸索之后,最终安装R语言的过程还是比较顺利的,但是其中还是有不少陷阱。搜遍网络,关于在信创电脑上安装R语言的文章实在是不多(确实是小众语言),特此记录,希望能够帮助到有需要的人。

安装R语言

首先第一步,安装R语言。这里要分开讨论,视电脑是否能够连上互联网而定。

能够连接互联网

如果电脑能够连上互联网,那么安装R语言相对来说就比较简单了,可以选择官方源安装也可以直接在R语言官网下载对应的安装包,然后编译安装。 如果你使用的是银河麒麟系统,我的建议是下载R语言的安装包进行编译安装。因为作为一个基于Ubuntu20改的系统,其官方源提供的R语言版本是3.6的,与当前的4.X版本之间存的巨大的差异,就比如我最爱的管道符号|>就是4.0以上版本才新加入的。同时有许多常有的包最新版本都不太能在3.6版本上使用。当然如果你不介意使用3.6版本,那么直接使用官方源安装也不失为一个便利的选择。

# 官方源安装R语言
sudo apt install r-base

如果你觉定使用4.X版本,进行编译安装,那么恭喜你,磨难开始了。此安装过程需要你对Linux有一定的了解,同时也需要你对R语言的编译安装有一定的了解。这次编译安装大量参考了大方基因在知乎分享的LinuxR语言编译安装介绍,同时也参考了袁凡的这篇博客

编译安装R语言的第一步就是下载R语言的安装包,虽然R语言官网画风古早,但是下载R语言的安装包还是比较方便的,选择合适的镜像,选择适合系统的版本即可(基于银河麒麟系统和电脑配置,我选择的是R-4.4.2.tar.gz)。

下载下来后,解压到合适的目录,这时候一定要主要,绝对目录中不能有任何中文字符,注意是任何中文字符(血泪教训),可以直接存在家目录下面~/R/R-4.4.2/。 然后在编译安装之前,一定要有的一步就是安装相关依赖。

# 安装编译工具依赖
sudo apt install gcc g++ gfortran make

一般来说安装编译工具不会存在太多问题,安装结束后就是下一步了,安装其他依赖,而这也就是问题频发的地方。

# 安装其他依赖
sudo apt install libjpeg-dev libtiff-dev libcairo2-dev libicu-dev libreadline-dev xorg-dev libbz2-dev liblzma-dev libpcre2-dev libcurl4-openssl-dev 

具体的报错和安装可以参考大方基因在知乎分享的LinuxR语言编译安装介绍。但我在这里遇到的是依赖问题则是各个包之间的版本问题。具体报错如下:

正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是
因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件
包尚未被创建或是它们已被从新到(Incoming)目录移出。
下列信息可能会对解决问题有所帮助:

下列软件包有未满足的依赖关系:
 libcairo2-dev : 依赖: libfontconfig1-dev (>= 2.2.95) 但是它将不会被安装
                 依赖: libfreetype6-dev (>= 2.1.10) 但是它将不会被安装
                 依赖: libpng-dev 但是它将不会被安装
                 依赖: libglib2.0-dev 但是它将不会被安装
 libcurl4-openssl-dev : 依赖: libcurl4 (= 7.68.0-1kylin2.7) 但是 7.68.0-1kylin2.14 正要被安装
 libicu-dev : 依赖: libicu66 (= 66.1-2kylin2.1) 但是 66.1-2kylin2.1k1 正要被安装
 libjpeg-dev : 依赖: libjpeg8-dev 但是它将不会被安装
 liblzma-dev : 依赖: liblzma5 (= 5.2.4-1kylin2) 但是 5.2.4-1kylin2.1 正要被安装
 libpcre2-dev : 依赖: libpcre2-8-0 (= 10.34-7) 但是 10.34-7kylin0.1 正要被安装
                依赖: libpcre2-16-0 (= 10.34-7) 但是 10.34-7kylin0.1 正要被安装
 libtiff-dev : 依赖: libtiff5 (= 4.1.0+git191117-2kylin0.20.04.2) 但是 4.1.0+git191117-2kylin0.20.04.7 正要被安装
               依赖: zlib1g-dev 但是它将不会被安装
 xorg-dev : 依赖: libfontenc-dev 但是它将不会被安装
            依赖: libxfont-dev 但是它将不会被安装
            依赖: libxft-dev 但是它将不会被安装
            依赖: xserver-xorg-dev 但是它将不会被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

从这里就可以看到,虽然银河麒麟系统是基于Ubuntu20改的,但是他的改动还是很不完全的,其中有大量的包之间的依赖问题没有解决,那么该怎么办呢?我选择了最简单粗暴的方法,降级! 不是依赖不对吗,那我就按照提示要求,安装符合依赖版本的包不就好了。举例这里libcurl4-openssl-dev提示要求安装7.68.0-1kylin2.7版本的libcurl4,但是我系统安装的是7.68.0-1kylin2.14版本,所以就报错了。那么我按照提示要求,安装7.68.0-1kylin2.7版本,问题不就解决了。当然安装前还是要先确认一下你要安装的包有没有对应版本。

# 查看libcurl4的版本
apt-cache show libcurl4 | grep Version

# 如果有我们需要的版本就安装
sudo apt install libcurl4=7.68.0-1kylin2.7

这么一路试下去,就可以把所有的依赖问题都解决了,虽然有更简洁的途径,如使用aptitude等工具,但是基于我上次使用aptitude,把系统给搞崩了,以至于不得不重新装系统的往事,我还是不要尝试了。

当我们顺利安装完所有依赖后,编译安装R语言基本就不存在什么问题了。

./configure --prefix='/home/quwb/R/R-4.4.2/' --enable-R-shllib=yes --with-readline=yes --with-libpng=yes --with-x=yes --with-blas --with-tcltk --with-pcre1=yes

结果如下就可以继续编译安装了。


R is now configured for aarch64-unknown-linux-gnu

  Source directory:            .
  Installation directory:      /home/quwb/R/R-4.4.2

  C compiler:                  gcc  -g -O2
  Fortran fixed-form compiler: gfortran  -g -O2

  Default C++ compiler:        g++ -std=gnu++17  -g -O2
  C++11 compiler:              g++ -std=gnu++11  -g -O2
  C++14 compiler:              g++ -std=gnu++14  -g -O2
  C++17 compiler:              g++ -std=gnu++17  -g -O2
  C++20 compiler:                 
  C++23 compiler:                 
  Fortran free-form compiler:  gfortran  -g -O2
  Obj-C compiler:	        

  Interfaces supported:        X11
  External libraries:          pcre2, readline, curl
  Additional capabilities:     PNG, JPEG, TIFF, NLS, cairo, ICU
  Options enabled:             shared BLAS, R profiling

  Capabilities skipped:        
  Options not enabled:         memory profiling

  Recommended packages:        yes

make -j$(nproc)
make install

如果

>/home/quwb/R/R-4.4.2/bin/R
WARNING: ignoring environment value of R_HOME

R version 4.4.2 (2024-10-31) -- "Pile of Leaves"
Copyright (C) 2024 The R Foundation for Statistical Computing
Platform: aarch64-unknown-linux-gnu

R是自由软件,不附带任何担保。
在某些条件下你可以将其自由分发。
用'license()'或'licence()'来看分发的详细条件。

R是个合作计划,有许多人为之做出了贡献.
用'contributors()'来看合著者的详细情况
用'citation()'会告诉你如何在出版物中正确地引用R或R程序包。

用'demo()'来看一些示例程序,用'help()'来阅读在线帮助文件,或
用'help.start()'通过HTML浏览器来看帮助文件。
输入'q()'退出R.

[原来保存的工作空间已还原]

至此大工告成。

不能连接互联网

如果电脑不能连上互联网,那么就需要先在有互联网的电脑上下载R语言的安装包,然后通过U盘、光盘等方式传输到信创电脑上,再按照提示安装即可。

至于需要apt安装的依赖,可以通过apt mirror的方式解决(https://apt-mirror.github.io/)。

安装包

安装glmnet

因为过去工作有用到glmnet包来计算有序回归问题,所以在刚领到新电脑后,为了能运行旧程序,在安装完R后glmnet包的安装优先级变放在了第一梯队。 然而与其他包的安装过程不同,glmnet包的安装过程属实算不上顺心。 先是安装直接报错:

install.packages("glmnet")
Error: package or namespace load failed for 'glmnet' in dyn.load(file, DLLpath = DLLpath, ...):
 unable to load shared object '/.../4.4/00LOCK-glmnet/00new/glmnet/libs/glmnet.so':
  /.../4.4/00LOCK-glmnet/00new/glmnet/libs/glmnet.so: undefined symbol: _gfortran_runtime_error_at
Error: loading failed

按照这个报错信息,我以为是因为系统里缺失了gfortran等相关组件。所以在网上搜素之后,多次尝试安装libgfortran,但即使安装成功后,安装glmnet依然报错。事已至此,常规的安装方法已经不太可行了,只能再去搜索。在此我必须要抱怨几句,当前中文互联网的搜索结果同质化太过严重,无论如何搜索所得到的结果都大同小异,几乎是一个模子里刻出来的,甚至连错误都一样,让人不得不摇头叹气。在苦苦搜索了良久之后,终于找到了与我有相同问题的,问题终于迎来了转机。

按照解决方法提供的思路,这里的问题是在安装glmnet时找不到libgfortran这个部件,那么我们就需要指定这个部件的位置,让R在安装时直接在指定位置引用就可以了。 于是按照这个思路,现在电脑中找到libgfortran的位置:

locate libgfortran

/usr/share/doc/libgfortran-10-dev

然后在目录下创建一个.R文件夹,并在文件夹中添加Makevars

mkdir .R & more .R/Makevars
vi .R/Makevars

Makevars文件中添加一句

FLIBS=-L/usr/share/doc/libgfortran-10-dev -lgfortran -lm

至此即可在安装时找到所需要的gfortran文件,接下来就是直接安装glmnet

install.packages("glmnet)

大工告成!