运行 glmnet 通过 Rscript 和 nohup 时出错
Error when running glmnet through Rscript and nohup
在使用 R 中的 glmnet
包创建预测模型时,我观察到此处和 here 中提到的相同错误。但是建议的重新安装 glmnet
软件包的解决方案并不能解决我的问题。
最小工作示例my_glmnet_script.R
:
#!/usr/bin/env Rscript --vanilla
# load libraries
library(methods)
library(glmnet)
library(doParallel)
# create toy model
n = 100
p = 250
x = matrix(rnorm(n*p), n, p)
y = matrix(rnorm(n), n, 1)
# number of parallel cores to use
ncores = 4
registerDoParallel(ncores)
# print this before glmnet throws error
print(sessionInfo())
# fit model
my.glmnet = cv.glmnet(x=x, y=y, grouped=FALSE, parallel=TRUE, nfolds=n)
cat("end script.\n")
我的命令:
nohup Rscript my_glmnet_script.R > nohup.out 2> nohup.err &
输出文件nohup.out
:
R version 3.4.3 (2017-11-30)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)
Matrix products: default
BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] parallel methods stats graphics grDevices utils datasets
[8] base
other attached packages:
[1] doParallel_1.0.11 iterators_1.0.8 glmnet_2.0-16 foreach_1.4.3
[5] Matrix_1.2-12
loaded via a namespace (and not attached):
[1] compiler_3.4.3 codetools_0.2-15 grid_3.4.3 lattice_0.20-35
错误文件nohup.err
:
nohup: ignoring input
Loading required package: Matrix
Loading required package: foreach
Loaded glmnet 2.0-16
Loading required package: iterators
Loading required package: parallel
Error in .Fortran("get_int_parms", fdev = double(1), eps = double(1), : "get_int_parms" not available for .Fortran() for package "glmnet"
Calls: cv.glmnet -> glmnet -> glmnet.control -> .Fortran
Execution halted
来自Rscript --version
的输出:
R scripting front-end version 3.3.3 (2017-03-06)
令人困惑的部分是以下命令工作得很好:
Rscript my_glmnet_script.R
如果我从 R 中调用 source("my_glmnet_script.R")
,它也能正常运行。
为什么 nohup
对 glmnet
和 Rscript
表现不好?是否有我可以加载的 R 包可以使这项工作正常进行?
原来 nohup
可能不是问题。
根据我的问题,nohup
的 R 版本是 R v3.4.3,而 Rscript --version
returns R v3.3.3。这是因为我的 $PATH
在使用系统范围的 R (v3.4.3) 之前指向我个人的 R (v3.3.3)。
为什么会调用系统范围的 R?答案就在脚本 hash-bang 中:
#!/usr/bin/env Rscript --vanilla
也就是说,调用 /usr/bin/env Rscript --version
会产生
R scripting front-end version 3.4.3 (2017-11-30)
并且系统范围的 R 在我的个人 (v3.3.3) 库中查找 glmnet
,.libPaths()
的第一个条目,它从未为 3.4.3 编译过:
/usr/bin/Rscript -e ".libPaths(.libPaths()[2:3]); library('glmnet')"
Error in library("glmnet") : there is no package called ‘glmnet’
故事的寓意:当您的服务器上安装了多个 R 版本时,请保持井井有条!
在使用 R 中的 glmnet
包创建预测模型时,我观察到此处和 here 中提到的相同错误。但是建议的重新安装 glmnet
软件包的解决方案并不能解决我的问题。
最小工作示例my_glmnet_script.R
:
#!/usr/bin/env Rscript --vanilla
# load libraries
library(methods)
library(glmnet)
library(doParallel)
# create toy model
n = 100
p = 250
x = matrix(rnorm(n*p), n, p)
y = matrix(rnorm(n), n, 1)
# number of parallel cores to use
ncores = 4
registerDoParallel(ncores)
# print this before glmnet throws error
print(sessionInfo())
# fit model
my.glmnet = cv.glmnet(x=x, y=y, grouped=FALSE, parallel=TRUE, nfolds=n)
cat("end script.\n")
我的命令:
nohup Rscript my_glmnet_script.R > nohup.out 2> nohup.err &
输出文件nohup.out
:
R version 3.4.3 (2017-11-30) Platform: x86_64-redhat-linux-gnu (64-bit) Running under: CentOS Linux 7 (Core) Matrix products: default BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 [7] LC_PAPER=en_US.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] parallel methods stats graphics grDevices utils datasets [8] base other attached packages: [1] doParallel_1.0.11 iterators_1.0.8 glmnet_2.0-16 foreach_1.4.3 [5] Matrix_1.2-12 loaded via a namespace (and not attached): [1] compiler_3.4.3 codetools_0.2-15 grid_3.4.3 lattice_0.20-35
错误文件nohup.err
:
nohup: ignoring input Loading required package: Matrix Loading required package: foreach Loaded glmnet 2.0-16 Loading required package: iterators Loading required package: parallel Error in .Fortran("get_int_parms", fdev = double(1), eps = double(1), : "get_int_parms" not available for .Fortran() for package "glmnet" Calls: cv.glmnet -> glmnet -> glmnet.control -> .Fortran Execution halted
来自Rscript --version
的输出:
R scripting front-end version 3.3.3 (2017-03-06)
令人困惑的部分是以下命令工作得很好:
Rscript my_glmnet_script.R
如果我从 R 中调用 source("my_glmnet_script.R")
,它也能正常运行。
为什么 nohup
对 glmnet
和 Rscript
表现不好?是否有我可以加载的 R 包可以使这项工作正常进行?
原来 nohup
可能不是问题。
根据我的问题,nohup
的 R 版本是 R v3.4.3,而 Rscript --version
returns R v3.3.3。这是因为我的 $PATH
在使用系统范围的 R (v3.4.3) 之前指向我个人的 R (v3.3.3)。
为什么会调用系统范围的 R?答案就在脚本 hash-bang 中:
#!/usr/bin/env Rscript --vanilla
也就是说,调用 /usr/bin/env Rscript --version
会产生
R scripting front-end version 3.4.3 (2017-11-30)
并且系统范围的 R 在我的个人 (v3.3.3) 库中查找 glmnet
,.libPaths()
的第一个条目,它从未为 3.4.3 编译过:
/usr/bin/Rscript -e ".libPaths(.libPaths()[2:3]); library('glmnet')"
Error in library("glmnet") : there is no package called ‘glmnet’
故事的寓意:当您的服务器上安装了多个 R 版本时,请保持井井有条!