Ошибка при запуске glmnet через Rscript и nohup - PullRequest
0 голосов
/ 28 августа 2018

При создании прогнозирующей модели с пакетом glmnet в R я заметил ту же ошибку, упомянутую и здесь, и здесь . Но предлагаемое решение переустановки пакета 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-версия сценария 3.3.3 (2017-03-06)

Запутанная часть в том, что следующая команда работает отлично:

Rscript my_glmnet_script.R

Он также работает нормально, если я позвоню source("my_glmnet_script.R") изнутри R.

Почему nohup ведет себя плохо с glmnet и Rscript? Есть ли пакет R, который я мог бы загрузить, чтобы это работало?

1 Ответ

0 голосов
/ 11 сентября 2018

Оказывается, что nohup, вероятно, не проблема.

Исходя из моего вопроса, версия R от nohup - это R v3.4.3, а Rscript --version возвращает R v3.3.3. Это потому, что мои $PATH указывают на мой личный R (v3.3.3) перед использованием общесистемного R (v3.4.3).

Почему вызывается системный R? Ответ заключается в сценарии хэш-взрыва:

#!/usr/bin/env Rscript --vanilla

Для того, чтобы позвонить /usr/bin/env Rscript --version приводит к

R-версия сценария 3.4.3 (2017-11-30)

и системный R ищет glmnet в моей личной (v3.3.3) библиотеке, первую запись .libPaths(), которая никогда не была скомпилирована для 3.4.3:

/usr/bin/Rscript -e ".libPaths(.libPaths()[2:3]); library('glmnet')"

Ошибка в библиотеке ("glmnet"): нет пакета с именем "glmnet"

Мораль истории: будьте организованы, если на вашем сервере установлено несколько версий R!

...