web-dev-qa-db-fra.com

Rscript: Il n'y a pas de paquet appelé ...?

Je veux exécuter des fichiers R en mode batch à l'aide de Rscript, mais il ne semble pas charger les bibliothèques dont j'ai besoin. L'erreur spécifique que je reçois est:

Error in library(timeSeries) : there is no package called 'timeSeries'
Execution halted

Cependant, j'ai le package timeSeries et je peux le charger depuis Rstudio, RGui et R depuis la ligne de commande sans problème. Le problème semble ne se produire que lors de l'exécution d'un script à l'aide de Rscript.

Mes variables système/environnement sont configurées comme:

C:\Program Files\R\R-3.1.0\bin\x64 (Appended to PATH)
R_HOME = C:\Program Files\R\R-3.1.0
R_User = Patrick

J'utilise la même version de R dans RStudio, RGui et R à partir de la ligne de commande. J'ai également vérifié .Library À partir de ces trois sources et j'ai également obtenu la même sortie.

Comment puis-je exécuter Rscript à partir de la ligne de commande avec les packages que j'utilise (et que j'ai installés) dans R?

MODIFIER:

J'utilise Rscript via Rscript script.r Sur la ligne de commande Windows dans le répertoire où se trouve script.r.

La sortie de Rscript -e print(.Library) est [1] "C:/PROGRA~1/R/R-31~1.0/library"

ce qui est cohérent avec les trois autres options que j'ai mentionnées: [1] "C:/PROGRA~1/R/R-31~1.0/library"

Cependant, si je mets cela dans mon script:

print(.libPaths()) 
library(timeSeries) #This is the package that failed to load

J'obtiens une sortie de:

[1] "C:/Program Files/R/R-3.1.0/library"
Error in library(timeSeries) : there is no package called 'timeSeries'
Execution halted

L'appel correspondant dans RStudio donne un chemin supplémentaire vers l'endroit où le package est réellement installé:

> print(.libPaths())
[1] "C:/Users/Patrick/Documents/R/win-library/3.1" "C:/Program Files/R/R-3.1.0/library"    
26
pbreach

En bref, la valeur retournée en appelant Sys.getenv('R_LIBS_USER') dans R.exe doit être la même que la valeur retournée en appelant ceci sur la ligne de commande:

Rscript.exe -e "Sys.getenv('R_LIBS_USER')"

et la valeur ci-dessus doit être incluse dans cet appel de ligne de commande:

Rscript.exe -e ".libPaths()"

Notez que les valeurs de R_LIBS_USER Peuvent être différentes entre R.exe et Rscript.exe si la valeur de R_USER est changé, soit dans le .Rprofile ou le dans le champ cible du raccourci de l'utilisateur vers R.exe , et en général, je trouve que le la bibliothèque utilisateur (c'est-à-dire .libPaths()[2]) n'est tout simplement pas définie dans Rscript.exe

Étant donné que j'aime définir R_USER Sur mon USERPROFILE, j'inclus le bloc suivant en haut de .R Fichiers que je souhaite exécuter sur plusieurs ordinateurs ou dans Rscript .Rprofile (c'est-à-dire Rscript -e "path.expand('~/.Rprofile')"):

# =====================================================================
# For compatibility with Rscript.exe: 
# =====================================================================
if(length(.libPaths()) == 1){
    # We're in Rscript.exe
    possible_lib_paths <- file.path(Sys.getenv(c('USERPROFILE','R_USER')),
                                    "R","win-library",
                                    paste(R.version$major,
                                             substr(R.version$minor,1,1),
                                             sep='.'))
    indx <- which(file.exists(possible_lib_paths))
    if(length(indx)){
       .libPaths(possible_lib_paths[indx[1]])
    }
    # CLEAN UP
    rm(indx,possible_lib_paths)
}
# =====================================================================
7
Jthorpe

Comme mentionné dans les commentaires, il semble que Rscript ne reconnaisse pas automatiquement les valeurs par défaut du chemin de la bibliothèque. J'écris un script R qui doit pouvoir être source depuis la ligne de commande sur les ordinateurs de différentes personnes, j'ai donc trouvé cette solution de contournement plus générale:

  • Commencez par stocker le chemin par défaut de la bibliothèque dans une variable (les fonctions provenant de Rscript peut trouver cela, elles ne le font tout simplement pas automatiquement)
  • Incluez ensuite ce chemin dans l'appel library() avec lib.loc = argument.
  • Cela devrait fonctionner quel que soit le chemin d'accès sur un ordinateur donné.

    library.path <- .libPaths()
    library("timeseries", lib.loc = library.path)
    

Merci encore à @flodel ci-dessus de m'avoir mis sur la bonne voie

6
rrr

Cette réponse n'aidera pas le demandeur d'origine (pbreach), mais elle peut aider quelqu'un d'autre qui tombe sur cette question et a un problème similaire à moi.

J'ai de nombreux fichiers de script bash.sh Qui appellent RScript pour exécuter les fichiers .R. Mon système d'exploitation est Windows 10 Et j'exécute ces fichiers bash en utilisant cygwin.

Tout fonctionnait bien jusqu'à hier, quand j'ai finalement mis à niveau mon R de Revolution R 8.0.1 beta À Microsoft R Open 3.4.1. Après cette mise à niveau, chaque script bash qui a appelé RScript a échoué pour la même raison que celle demandée ici (par exemple Error in library(Zoo) : there is no package called 'Zoo').

L'enquête a révélé que RScript fonctionnait bien s'il était appelé à partir d'un DOS Shell Au lieu d'un shell bash cygwin.

Par exemple, si j'exécute ceci dans un DOS Shell

C:\Progra~1\Microsoft\ROpen~1\R-3.4.1\bin\x64\Rscript.exe -e ".libPaths()"

Je vois la sortie

[1] "C:/Users/HaroldFinch/Documents/R/win-library/3.4"
[2] "C:/Program Files/Microsoft/R Open/R-3.4.1/library"

J'ai finalement découvert la raison. Comme expliqué dans la FAQ R , pour définir son répertoire personnel, R utilisera d'abord la variable d'environnement R_USER Si elle est définie, sinon elle utilisera HOME variable d'environnement si définie, sinon elle utilisera le répertoire "personnel" de Windows.

Ma configuration Windows ne définit ni les variables d'environnement R_USER Ni HOME. Ainsi, dans le cas DOS Shell, R utilise mon répertoire "personnel" Windows (C:/Users/HaroldFinch/Documents). C'est bien, car c'est là que toutes mes bibliothèques sont installées (C:/Users/HaroldFinch/Documents/R/win-library/3.4).

En revanche, cygwin définit et exporte une variable d'environnement HOME qui pointe vers mon répertoire utilisateur cygwin, qui ne contient aucun élément R. Par conséquent, RScript appelé depuis cygwin avait un mauvais répertoire de base R et n'a donc pas pu charger les bibliothèques.

Il existe probablement de nombreuses façons de résoudre ce problème. J'ai décidé que mon script bash définisse une variable d'environnement R_USER Qui pointe vers mon répertoire utilisateur Windows.

Par exemple, si j'exécute ceci dans un cygwin bash Shell:

R_USER="C:/Users/HaroldFinch/Documents"
export R_USER
/cygdrive/c/Progra~1/Microsoft/ROpen~1/R-3.4.1/bin/x64/Rscript.exe -e ".libPaths()"

Je vois la sortie

[1] "C:/Users/HaroldFinch/Documents/R/win-library/3.4"
[2] "C:/Program Files/Microsoft/R Open/R-3.4.1/library"

qui est exactement la même sortie que l'exemple de shell DOS ci-dessus.

3
HaroldFinch

Packrat est une autre cause. Si vous utilisez Packrat, RStudio l’active pour vous lorsque vous ouvrez le projet. RScript ne le fait pas, vous avez donc besoin d'une Packrat::on() au début de votre script (avant les appels de la bibliothèque).

0
Dov Rosenberg