2012-11-20 9 views
6

Mam skrypt (nazywają to Main.R), który ma następujący kod, aby znaleźć się po uruchomieniu go:W jaki sposób skrypt może znaleźć się w R z poziomu wiersza poleceń?

frame_files <- lapply(sys.frames(), function(x) x$ofile) 
frame_files <- Filter(Negate(is.null), frame_files) 
main.dir <- dirname(dirname(frame_files[[length(frame_files)]])) 

ta jest stosowana w celu uzyskania katalogu powyżej własnego katalogu, main.dir, który jest używany, aby zadzwonić inne skrypty dotyczące tej ścieżki.

Jestem zainteresowany uruchomieniem tego skryptu z linii poleceń, na przykład

R CMD BATCH Main.R 

lub

Rscript Main.R 

Niestety, powyższe polecenia nie działają gdy zgłoszę skrypt z poleceniem linia.

Czy istnieje kod mógłbym umieścić w Main.R lub opcja kupna do R lub Rscript że można używać zamiast tego?

Dokładniej, rozwiązanie musi działać w systemie Windows.

+0

Czy to pomaga? http://stackoverflow.com/questions/750786/whats-the-best-way-to-use-r-scripts-on-the-command-line – atomh33ls

+0

Szczerze mówiąc, nie jestem pewien, ale nie robi tego " Wyglądasz na to. Muszę powiedzieć, że nie jestem świetny w używaniu wiersza poleceń. Zmieniłem swój post, aby dodać, że używam systemu Windows, nie wiem, czy to ma wpływ na odpowiedź. Czytając inne posty, mam wrażenie #! nie działa w systemie Windows. – J4y

Odpowiedz

8

Poniżej znajduje się rozwiązanie, które daje poprawną ścieżkę pliku, gdy skrypt jest uruchamiany zarówno z source lub Rscript.

# this is wrapped in a tryCatch. The first expression works when source executes, the 
# second expression works when R CMD does it. 
full.fpath <- tryCatch(normalizePath(parent.frame(2)$ofile), # works when using source 
       error=function(e) # works when using R CMD 
        normalizePath(unlist(strsplit(commandArgs()[grep('^--file=', commandArgs())], '='))[2])) 
dirname(full.fpath) 

Kluczem do tego jest funkcja normalizePath. Biorąc pod uwagę względną lub skróconą nazwę ścieżki, normalizePath zwróci poprawną ścieżkę lub zgłosi błąd. Kiedy uruchamiasz skrypt z Rscript, jeśli podasz normalizePath podstawową nazwę pliku bieżącego skryptu, zwróci pełną ścieżkę, niezależnie od tego, jaki jest twój bieżący katalog. Dostaje nawet ścieżkę w prawo, gdy podasz względną ścieżkę do R CMD i istnieje skrypt o tej samej nazwie w bieżącym katalogu!

W powyższym kodzie wyodrębniam nazwę pliku z jednego z ciągów zwracanych przez commandArgs. Jeśli spojrzysz na wyjście commandArgs, zobaczysz, że nazwa pliku jest czwartym argumentem. Argument jest zapisywany jako "--file = yourscript.R", więc w ostatnim wierszu powyżej dzielę ciąg na "=" i wyciągnę nazwę pliku.

+1

+1 - ale uruchom 'Rscript' z dodatkowymi opcjami, takimi jak' --vanilla' i '--file = [...]' może skończyć się gdziekolwiek. Byłoby rozsądniej użyć funkcji podobnej do 'grep', aby ją znaleźć niż użyć pozycji zakodowanej na stałe, takiej jak' 4'. – flodel

+0

Dzięki za zwrócenie na to uwagi. Zostawiłem to dla zwięzłości. –

+0

@mplourde Dzięki! Nie wiedziałem o 'normalizePath'.Podoba mi się, że masz wszystko tam z 'tryCatch'. – J4y

1

Na ideą jest zapewnienie ścieżki jako argumentu do Main.R

Przypuszczam, że nazywają go RScript.

Rscript Main.R 'path' 

w Main.R dodaniu kodu do odczytu argumentu

args <- commandArgs(trailingOnly = TRUE) 
mainpath <- as.character(args[1]) 
Powiązane problemy