2014-12-28 21 views
14

Voglio eseguire i file R in modalità batch utilizzando Rscript, tuttavia non sembra che stia caricando le librerie di cui ho bisogno. L'errore specifico che sto ottenendo è:Rscript: non esiste un pacchetto chiamato ...?

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

Tuttavia io ho il pacchetto timeSeries e possono caricarli da Rstudio, RGui, e R dalla riga di comando non è un problema. Il problema sembra essere solo quando si esegue uno script utilizzando Rscript.

mie variabili di sistema/ambiente sono configurati come:

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 

Sono in esecuzione la stessa versione di R in RStudio, RGui, e R da linea di comando. Ho anche controllato .Library da queste tre fonti e ho ottenuto lo stesso risultato.

Come posso eseguire Rscript dalla riga di comando con i pacchetti che sto usando (e ho installato) in R?

EDIT:

Sto usando rscript tramite Rscript script.r nella riga di comando di Windows nella directory in cui si trova script.r.

L'uscita del Rscript -e print(.Library) è [1] "C:/PROGRA~1/R/R-31~1.0/library"

che è coerente con le altre tre opzioni che ho citato: [1] "C:/PROGRA~1/R/R-31~1.0/library"

Tuttavia, se ho messo questo nel mio script:

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

ottengo un'uscita di:

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

La chiamata corrispondente RStudio dà un percorso aggiuntivo a cui è effettivamente installato il pacchetto:

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

@flodel -Come richiesto – pbreach

+1

ok ... Ora ricominciamo con '.libPaths()' ... Si potrebbe anche aggiungere 'print (.libPaths())' subito prima 'library (timeSeries)' all'interno 'script .r'. – flodel

+0

Ok fantastico! Quindi ora conosciamo il problema. Il percorso della libreria Rscript non è collegato a dove il pacchetto è effettivamente installato (vedi modifica) ma RStudio e l'altra sono. – pbreach

risposta

3

In breve, il valore restituito dalla chiamata Sys.getenv('R_LIBS_USER') in R.exe deve essere uguale al valore restituito da chiamare questo nella riga di comando:

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

e il valore di cui sopra deve essere incluso in questa riga di comando chiamata:

Rscript.exe -e ".libPaths()" 

Nota che i valori di R_LIBS_USER potrebbero essere diversi tra R.exe e Rscript.exe se il valore di R_USER è stato modificato, nello .Rprofile o nello in target field of user's shortcut to R.exe e, in generale, trovo che la libreria utente (ovvero .libPaths()[2]) non è sufficiente impostare in Rscript.exe

Dal momento che sono appassionato di impostazione R_USER al mio USERPROFILE, includo il seguente blocco in in cima .R file che vorrei per funzionare su computer mulitiple o in rscript. exe .Rprofile (es 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) 
} 
# ===================================================================== 
4

Come accennato nei commenti, sembra rscript non riconosce automaticamente le impostazioni predefinite del percorso della libreria. Sto scrivendo uno script in R che ha bisogno di essere fonte-grado dalla riga di comando su computer di persone diverse, così mi si avvicinò con questa soluzione più generale:

  • primo negozio percorso della libreria di default in una variabile (Rscript- le funzioni originarie possono trovare, ma non automaticamente)
  • Quindi includere il percorso nella chiamata library() con l'argomento lib.loc =.
  • Questo dovrebbe funzionare indipendentemente dal percorso su un determinato computer.

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

Grazie ancora a @flodel sopra per avermi messo sulla strada giusta

+0

C'è un caso limite da tenere a mente dove il precedente non funzionerà: http://stackoverflow.com/questions/28312901/r-keeps-downloading-packages-to-tmp-directory – Paul

+1

Umm, perché hai usato ' cat' nella riga 'library.path <- cat (.libPaths())'? Nel mio sistema, 'cat' stampa il valore di' .libPaths() 'per std out (cioè la console) e restituisce' NULL', il che significa che 'library.path' è assegnato a' NULL' che non è quello che penso tu vuoi. In altre parole, perché non hai semplicemente fatto 'library.path = .libPaths()'? – HaroldFinch

+0

@HaroldFinch hai ragione! Ho modificato la mia risposta di conseguenza. Sono sicuro che questo ha funzionato quando l'ho postato, ho un vago ricordo riguardo la necessità di aggiungerlo per il formato, ma sono tornato alla sceneggiatura che è dentro e hai perfettamente ragione, stavo anche ricevendo NULL. Grazie! – rrr

1

Questa risposta non aiuterà il richiedente originale (pbreach), ma può aiutare qualcun altro che si imbatte in questa domanda e ha un problema simile a me.

Ho molti file di script bash.sh che chiamano RScript per eseguire i file .R. Il mio sistema operativo è Windows 10 e eseguo quei file bash utilizzando cygwin.

Tutto aveva funzionato bene fino a ieri, quando ho finalmente aggiornato il mio R da Revolution R 8.0.1 beta a Microsoft R Open 3.4.1. Dopo questo aggiornamento, ogni script bash che ha chiamato RScript non è riuscito a causa della stessa identica ragione qui richiesta (ad esempio Error in library(zoo) : there is no package called 'zoo').

L'indagine ha rivelato che RScript ha funzionato correttamente se chiamato da un DOS shell anziché da una shell bash cygwin.

Per esempio, se eseguo questo in un DOS shell

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

vedo l'uscita

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

alla fine ho scoperto il motivo. As explained in the R FAQ, per definire la propria directory home, R utilizzerà prima la variabile di ambiente R_USER se definita, altrimenti utilizzerà la variabile di ambiente HOME se definita, altrimenti utilizzerà la directory "personale" di Windows.

La mia configurazione di Windows non definisce né le variabili di ambiente R_USERHOME. Pertanto, nel caso DOS shell, R utilizza la directory "personale" di Windows (C:/Users/HaroldFinch/Documents). Questo è buono, perché è lì che sono installate tutte le mie librerie (C:/Users/HaroldFinch/Documents/R/win-library/3.4).

Al contrario, cygwin definisce ed esporta una variabile HOME ambiente che punta al mio indice cygwin utente, che manca di qualsiasi R roba.Quindi, RScript chiamato da cygwin aveva una directory home errata R e quindi non è riuscito a caricare le librerie.

Ci sono probabilmente molti modi per risolvere questo problema. Ho deciso di far sì che il mio script di bash impostasse una variabile di ambiente R_USER che punta alla mia directory utente di Windows.

Ad esempio, se eseguo questo in 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()" 

vedo l'uscita

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

che è esattamente la stessa uscita ora come shell DOS esempio precedente.

Problemi correlati