2015-04-14 6 views
5

Ich möchte ein Skript file.R mit Rscript ausführen. In file.R verwende ich das Paket dplyr.Rscript and Packages: Wie und wann bestimmen, welche Pakete geladen werden?

# file.R 
df <- data.frame(ID,x,y,z,...) 
library(dplyr) 
filter(df, ID != "null") 
...... 

Wenn ich in der Batch-Datei alle Optionen nicht angeben, funktioniert alles einwandfrei als file.R die Linie jedoch library(dplyr)

# 1) no specification of packages in the batch file 
Rscript.exe file.R arg1 arg2 arg3 > outputFile.Rout 2>&1 

enthält, wenn ich default-packages=utils in der Batchdatei hinzufügen,

der Teil von file.R mit dplyr funktioniert nicht mehr (Error in filter(df, ID != 'null') : Object 'ID' could not be found)

Seit ?Rscript sagt

--default-packages=list 
where list is a comma-separated list of package names or NULL 

ich versucht, indem --default-packages=utils,dplyr,

# 3) specification of packages utils and dplyr in the batch file 
Rscript.exe default-packages=utils,dplyr file.R arg1 arg2 arg3 > outputFile.Rout 2>&1 

, die den gleichen Fehler verursacht, wie in 2

Warum ist Batch-Datei 1 die einzige, die funktioniert? Ich rufe das gleiche R-Skript in allen 3 Alternativen auf.

+0

Gibt es einen Grund, warum Sie die Pakete an der Befehlszeile angeben müssen, anstatt einfach die entsprechende 'Bibliothek' am Anfang Ihres Skripts zu platzieren? – cdeterman

+0

Die Sache ist, dass die 'Bibliothek' am Anfang des Skripts nicht die Lösung ist, und das ist der Grund für meine Veröffentlichung. In allen 3 Alternativen habe ich das gleiche Skript 'file.R' aufgerufen, das die Bibliotheksbefehle am Anfang enthielt. – rmuc8

+0

Ich dachte, Sie sagten, dass Option 1 funktioniert, wo Sie keine Optionen angeben? Missverstehe ich deine Aussage? Dein Problem ist nicht ganz klar. – cdeterman

Antwort

6

Der Parameter --default-packages gibt die Pakete an, die standardmäßig geladen werden sollen. Es wird nicht zur Liste der Standardpakete hinzugefügt - es ersetzt die Liste. Das bedeutet, dass Sie auch alle anderen Basispakete angeben müssen, auf die Sie sich verlassen. Sie können dies sehen, indem Sie ein einfaches Testskript erstellen, das sessionInfo()

aufruft. In Datei "env.R ":

sessionInfo() 

Anruf aus der Klemme: Rscript env.R

R version 3.1.2 (2014-10-31) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets base 

ich diesen Anruf nun ändern. Rscript --default-packages=utils env.R

R version 3.1.2 (2014-10-31) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] utils base 

Also brauchen Sie die anderen fehlenden Pakete angeben

RScript --default-packages=stats,graphics,grDevices,utils,datasets,base,methods env.R 

und ich warf auch Methoden hinein.

Mit dem gesagt, wenn Sie keine Probleme hatten, wenn Sie es nur mit RSScript ausgeführt habe, verstehe ich nicht, warum Sie versuchen, mit dem Standard-Paket-Argument zu verwirren. Es scheint, als ob du nur Probleme für dich selbst erzeugst, es sei denn, es gibt andere Probleme, die du lösen willst, die du uns nicht sagst.

+0

_Es schafft nur Probleme_ weil, wie @Dason sagt, Sie es falsch verwenden. "Standard-Pakete" ist nicht dasselbe wie die "diese Standard-Pakete PLUS ein paar, die ich brauche". –

0

Können Sie den folgenden Test versuchen? Ich kann das nicht in die Kommentare einfügen. Dies läuft auf meinem System gut.

test.r

library(dplyr) 

data(iris) 

iris %>% 
group_by(Species) %>% 
summarise(mean(Sepal.Length)) 

In Ihrem Terminal:

Rscript --default-packages=utils,datasets,dplyr test.R

+0

Es funktioniert. Wenn ich jedoch 'Datasets' nicht verwende, ist dies nicht der Fall. – rmuc8

+0

@ rmuc8, das ist dann richtig. Sie benötigen das Paket 'datasets', um auf den Datensatz 'iris' zugreifen zu können. – cdeterman

4

Für Vollständigkeit und meinen Kommentar zu veranschaulichen, arbeitet Charles Beispiel für mich auf einer Linie littler verwenden. Ich bin Zeilenumbruch es hier nur für die Ausstellung:

[email protected]:~$ r -ldplyr -e'iris %>% \ 
         group_by(Species) %>% \   
         summarise(mean(Sepal.Length)) %>% \ 
         print' 
Source: local data frame [3 x 2] 

    Species mean(Sepal.Length) 
1  setosa    5.006 
2 versicolor    5.936 
3 virginica    6.588 
[email protected]:~$ 

Wie gesagt, das ist wirklich eine Zeile (und ein Unterschied ist, dass r will ausdrücklich print zu).

Aber wie Sie sehen können, wird auch das datasets Paket automatisch von r geladen.

Verwandte Themen