2012-11-20 7 views
6

Ben bir senaryo var bunu çalıştırdığınızda kendisini bulmak için aşağıdaki kodu vardır ki (Main.R diyoruz): Bu çağırmak için kullanılan kendi dizine, main.dir, yukarıdaki dizin almak için kullanılırKomut satırında çalışan bir komut dosyası kendini nasıl bulabilir?

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)]])) 

Bu yola göre diğer betikler.

ben komutundan senaryoyu çağırdığınızda

R CMD BATCH Main.R 

veya

Rscript Main.R 

Maalesef yukarıdaki komutları çalışmıyor mesela ben, bir komut satırından bu komut dosyasını çalıştırarak ilgileniyorum hat.

Main.R'a koyabildiğim herhangi bir kod veya R veya Rscript numaralı çağrıları kullanabileceğim bir seçenek var mı? Daha spesifik olarak, çözümün Windows'da çalışması gerekecektir. fikri üzerine

+0

Bu yardımcı olur mu? http://stackoverflow.com/questions/750786/whats-the-best-way-to-use-r-scripts-on-the-command-line – atomh33ls

+0

Adil olmak gerekirse, emin değilim, ama ' Öyle gözüküyor. Söylemeliyim ki, komut satırını kullanmakta pek iyi değilim. Gönderiyi Windows kullanıyorum eklemek için düzenledim, cevabın bir fark yaratıp yaratmadığını bilmiyorum. Bazı diğer yazıları okumak, bende izlenim #! Windows'da çalışmıyor. – J4y

cevap

8

senaryo source ile veya her iki çalıştırıldığında size doğru dosya dizin yolunu verecek bir çözümdür argüman okumak için kodu ekleyin 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) 

bu anahtarı işlevi normalizePath olduğunu. Göreli veya kısaltılmış bir yol adı verildiğinde, normalizePath geçerli bir yol döndürür veya bir hata oluşturur. Komut dosyasını Rscript'den çalıştırırken, geçerli komut dosyasının temel dosya adı normalizePath verirseniz, geçerli dizininizin ne olduğuna bakılmaksızın tam yol döndürür. R CMD'ye göreceli bir yol sağladığınızda yolu bile alır ve geçerli dizinde aynı ada sahip bir betik var!

Yukarıdaki kodda, dosya adını commandArgs tarafından döndürülen dizelerden birinden ayırıyorum. commandArgs çıktısına bakarsanız, dosya adının 4. argüman olduğunu görürsünüz. Argüman '--file = yourscript.R' olarak kaydedilir, bu yüzden yukarıdaki son satırda '=' üzerindeki dizeyi bölerim ve dosya adını çıkarırım.

+1

+1 - ancak 'Rscript 'işlevini' -vanilla' ve '--file = [...]' gibi ekstra seçeneklerle çalıştırın. '4' gibi sabit kodlu bir konum kullanmak yerine, onu bulmak için grep işlevini kullanmak akıllıca olacaktır. – flodel

+0

Buna dikkat ettiğiniz için teşekkür ederiz. Kısalık uğruna bıraktı. –

+0

@mplourde Teşekkürler! NormalizePath'ın farkında değildim.Ben onu 'tryCatch' ile her şey var. – J4y

1

Ben Sen RScript ile diyoruz varsayalım sizin Main.R

argüman olarak yol vermektir. senin Main.R içinde

Rscript Main.R 'path' 

Eğer

Aşağıda
args <- commandArgs(trailingOnly = TRUE) 
mainpath <- as.character(args[1])