2011-01-26 6 views
9

Mam trudności z przekazaniem nazwy pliku do mojego skryptu R. Plik jest plikiem csv z parametrami wsadowymi dla wielu uruchomień skryptu. Próbuję dołączyć to tutaj, aby użytkownik nie musiał edytować skryptu R w celu określenia położenia tego pliku.Linia poleceń R przekazująca nazwę pliku do skryptu w argumentach (Windows)

składnia wiersza poleceń My Windows jest:

R CMD BATCH --slave "--args fn=batch.csv" myscript.r output.txt 

Najbliżej Dostałem do pobierania w moim skrypcie R jest robienie:

eval(parse(file=commandArgs()[8]))) 
batch_args = read.table(fn, sep=",") 

I eksperymentowali z commandArgs(trailingOnly=TRUE) i parse(text=commandArgs()[8]), etc ., bez szczęścia. Większość dokumentacji, którą widziałem, nie dotyczy w szczególności przekazywania nazw plików. Czy ktoś może pomyśleć o rozwiązaniu?

+0

Polecam przy użyciu 'Rscript' zamiast' R CMD BATCH'. Jakiej wersji R używasz? –

+0

Korzystanie z R 2.12.0. Czy mogę używać Rscript przy użyciu tej samej składni? – Benjamin

+0

Nie, składnia jest inna. Porównaj '? Rscript' i'? BATCH'. –

Odpowiedz

17

Jak powiedziałem w moim komentarzu, użyłbym Rscript zamiast R CMD BATCH:

Rscript myscript.R batch.csv 

gdzie myscript.R zawiera:

args <- commandArgs(TRUE) 
batch_args <- read.table(args[1], sep=",") 
# loop over multiple runs 
+0

Z tą dokładną składnią, otrzymuję komunikat "Błąd: nie mogę znaleźć funkcji" batch_args ". Jeśli wstawię instrukcję print (args), to jest tam" batch.csv " – Benjamin

+0

Nie mam nic przeciwko używaniu Rscript, ale mogę Otrzymuję dane wyjściowe zapisane do pliku podobnego do R CMD BATCH - Slave? Dlaczego Rscript jest lepszy? – Benjamin

+0

@Benjamin: Myślę, że skopiowałeś i/lub wkleiłeś coś źle. Nie ma mowy, że napisany przeze mnie kod dałby ci ten błąd, ponieważ ten błąd wymaga czegoś takiego jak 'batch_args()'. –

6

Co masz na myśli mówiąc "nie ma szczęścia"? Nazwa pliku jest tam, w funkcji commandArgs(), po prostu trzeba się dowiedzieć, jak ją wydobyć. Kod i komunikaty o błędach są przydatne.

To nie jest problem, jeśli jedynym dodatkowym argumentem jest nazwa pliku, znasz jego położenie. To, co cię zmyli, jest wtedy, gdy zaczniesz przyjmować bardziej złożone argumenty.

Powoduje to również komplikacje przy przekazywaniu "fn = foo.csv". Wystarczy podać nazwę pliku i przypisać go do fn w swoim skrypcie. Jeśli naprawdę chcesz używać eval prawdopodobnie trzeba zacytować swoją nazwę pliku, a tym samym myscript.r jest:

ca = commandArgs(trailingOnly=TRUE) 
eval(parse(text=ca)) 
print(read.csv(fn)) 

i uruchomić w następujący sposób:

R --slave "--args fn='batch.csv'" < myscript.r 
    A B C 
    1 1 2 3 
    2 6 8 3 

Gdzie batch.csv jest prosty plik CSV.

Możesz zrobić pętlę nad "ca" w swoim skrypcie i ocenić wszystko. Jest to jednak nieco niebezpieczne, ponieważ można łatwo złamać podstawową funkcjonalność.

Osobiście obejrzę pętlę ca, poszukaj par nazwa = wartość dla znanego zestawu nazw i ustawię je. Zasadniczo realizacji getopt, ale ktoś chyba że odbywa się już ...

+0

Prawie działa, ale znika podczas próby zrobienia pliku read.table, ponieważ "batch.csv" nie jest rozpoznawany jako poprawna nazwa pliku, ale jako ciąg. Chociaż podanie jej pełną ścieżką może pomóc, ale potem pęknie z powodu spacji.Obecnie uruchamiam go z katalogu, w którym znajdują się wszystkie pliki (.r, .txt i .csv). – Benjamin

+0

Nie ma czegoś takiego jak "poprawna nazwa pliku". R przechowuje nazwy plików w łańcuchach. fn = "batch.csv"; read.csv (fn) odczyta plik batch.csv. – Spacedman

+0

OK, mój przykład teraz czyta z pliku csv jako dowód koncepcji. – Spacedman

7

Poza używaniem Rscript (jak powiedział Josh) powinieneś także używać pakietów CRAN getopt lub optparse, ponieważ zostały napisane w tym celu.

+1

+1 dla wskaźnika do pakietu 'optparse'. – reprogrammer

2

spróbować

fn="batch.csv"; R CMD BATCH --slave "--args $fn" myscript.r output.txt