GNU R 3.6.3中solve()函数致CLI冻结问题求助
solve()函数执行时冻结 我在使用Ubuntu 20.04默认apt仓库安装的R 3.6.3时,遇到了solve()函数的异常问题:
- 调用
solve()求矩阵逆时(比如测试的2x2矩阵),终端启动的R会话会直接冻结,htop显示单个CPU核心占用100% - RStudio图形界面内执行该代码正常,但RStudio内置终端执行同样冻结;RMarkdown中使用该函数也会导致会话冻结,无法生成文档
- 测试代码如下:
D = matrix( data = c(1, 2, 3, 4), nrow = 2, ncol = 2, byrow = TRUE ) solve(D) - 补充细节:
solve(A,B)中求解线性系统(B为向量)的功能正常,但当B为矩阵时仍会冻结;而使用QR分解的qr.solve(A)可以正常工作
已尝试的无效解决方案
- 用
R --vanilla启动R会话 - 重启电脑
- 切换使用外置显卡
- 重装apt源的
r-base-core包 - 更换不同终端模拟器(如Konsole)
社区反馈与测试结果
AskUbuntu用户N0rbert在干净的20.04 LTS虚拟机中无法复现该问题,并提供了测试脚本。但我执行该脚本时,会话依然在solve(D)处冻结,相关输出如下:
kobyeongmin@odie:~/Temp$ ./r-test.sh
R version 3.6.3 (2020-02-29) -- "Holding the Windsock"
Copyright (C) 2020 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
...(省略版权信息)D = matrix(
- data = c(1, 2, 3, 4),
- nrow = 2,
- ncol = 2,
- byrow = TRUE
- )
solve(D)
我的R路径和版本信息:
kobyeongmin@odie:~$ which R /usr/bin/R kobyeongmin@odie:~$ R --version R version 3.6.3 (2020-02-29) -- "Holding the Windsock" Copyright (C) 2020 The R Foundation for Statistical Computing Platform: x86_64-pc-linux-gnu (64-bit) ...(省略版权信息)
专家建议
从目前信息来看,这个问题大概率是系统特定的环境冲突导致的——干净环境无法复现,且常规修复手段无效。可以尝试以下步骤进一步排查和解决:
排查线性代数库冲突
R的solve()依赖底层BLAS/LAPACK库,Ubuntu 20.04默认可能使用OpenBLAS或MKL。先检查当前R使用的线性代数库:sessionInfo()查看输出中的
BLAS/LAPACK部分,如果是OpenBLAS,尝试切换到参考实现的BLAS:sudo update-alternatives --config libblas.so.3-x86_64-linux-gnu sudo update-alternatives --config liblapack.so.3-x86_64-linux-gnu选择
libblas/liblapack.so.3-x86_64-linux-gnu(参考实现)后,重启R再测试solve()。升级R版本
你当前使用的R 3.6.3是2020年的旧版本,Ubuntu默认仓库版本通常滞后。建议添加CRAN官方源安装更新的R版本(如4.x系列):# 添加CRAN源 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/' sudo apt update sudo apt install r-base-core升级后再测试
solve()函数是否恢复正常。检查系统硬件/驱动问题
虽然切换外置显卡无效,但可以尝试暂时禁用硬件加速设置,或检查CPU是否存在过热、超频等稳定性问题。也可以尝试在单核心模式下运行R,观察是否还会冻结:taskset -c 0 R启动后执行测试代码,查看状态变化。
编译R源码
如果以上方法都无效,可尝试从源码编译R,完全控制依赖库的使用,避免系统预装库的冲突:# 安装编译依赖 sudo apt build-dep r-base-core # 下载R 4.3.1源码(可替换为最新稳定版) wget https://cran.r-project.org/src/base/R-4/R-4.3.1.tar.gz tar -xzf R-4.3.1.tar.gz cd R-4.3.1 # 配置编译选项(使用参考BLAS/LAPACK) ./configure --with-blas --with-lapack make sudo make install编译完成后使用新安装的R测试问题是否解决。
内容的提问来源于stack exchange,提问作者Ko Byeongmin

