2014-06-23 18 views
8

R'de, alt klasördeki bir dosyaya erişmek istiyorum. Fakat çalışma dizinini değiştirmek istemiyorum, sonra geri dönüyorum. Zaman kaybetti ve uzun.Dosyayı değiştirmeden alt klasördeki dosyaya nasıl girilir?

Örneğin, /home/phuong klasöründe çalışıyorum. İşte phuong'un ağaç yapısı.

phuong-> data1, data2, data3. 
data1-> abc.csv, def.csv, script1.R 
data2-> bond.csv, option.csv, pricing.R 
data3->..... 

Yani ben abc.csv, def.csv veri yüklemek ve pricing.R kod çalıştırmak istiyorum.

kullanımlık kod setwd, benim birçok zaman kaybetti yapmak ve bunun gibi, bu kadar aptal kod bakmak Yani eğer: Ben başka bir klasöre klasörden taşımak için bir çok kez kaybetti

setwd("/home/phuong/data1"); 

read.csv("abc.csv"); 
read.csv("def.csv"); 
setwd("/home/phuong/data2"); 
source("pricing.R") 

ama hepsinde Aynı klasör home/phuong/. setwd komutu olmadan alt klasördeki herhangi bir dosyaya erişmenin bir yoluna ihtiyacım var. Lütfen bana yardım edin, thks.

setwd('/home/hermie') 
myData <- read.csv('./data/myCsvFile.csv') 

Tabii siz de gidin olabilir:

+1

Neden her zaman dizini değiştirmeniz gerekiyor? Gereksiz. –

cevap

23

çalışma dizinini varsayarsak bunu basitçe yapabilirsiniz, (en /home/hermie/data diyelim) /home/hermie olduğunu ve mevcut WD altında bir dizinden bir .csv dosyası yüklemek istiyorum dizin ağacında "yukarı". Bob'un ev dizinine (/home/bob) bir dosya yüklemek istediğinizi varsayalım. Aşağıdaki gibi yapabilirsiniz:

setwd('/home/hermie') 
data_from_bob <- read.csv('../bob/otherDataFile.csv') # Of course, this will work 
                 # only if you can read 
                 # files from that directory 

Bu yardımcı olur umarım.


Güncelleme nasılsa

Sana birinin ... sizin için çözüm yazmak istiyorum düşünüyorum ve bu teklif:

> setwd('/home/phuong') 
> data_abc <- read.csv('./data1/abc.csv') 
> data_def <- read.csv('./data1/def.csv') 
> source('./data2/pricing.R') 

yüzden gerçekten zor olmasıbunu mı bunu yazmak için? WD'nizi yolun her adımında değiştirdiyseniz çok daha fazla yazmak zorunda kalacaksınız.

Ve sizin bash terminalde sembolik bağı benim sugestion, yaklaşık böyle bir şey yapabileceğini: o zaman

$ cd /home/phuong 
$ ln -s ./data1/abc.csv data1_abc.csv 
$ ln -s ./data1/def.csv data1_def.csv 
$ ln -s ./data2/pricing.R pricing.R 

Ve R:

> setwd('/home/phuong') 
> data_abc <- read.csv('data_abc.csv') 
> data_def <- read.csv('data_def.csv') 
> source('pricing.R') 
+0

Bu şekilde biliyorum, ancak bu bana klasörün tam yolunu yazmamı sağlıyor ve bazı klasörde farklı zamana sahip çok sayıda dosya yüklediğimde kodumu çok uzun ve karmaşık hale getiriyor. –

+1

dosya sisteminizde bağlantılar oluşturun. R ile ilgili bir probleminiz yok, klasör yapınız ile ilgili bir probleminiz var ... ve iki çözümü var: 1. Dosyalarınızı rahat hissettiğiniz şekilde yeniden düzenleyin veya 2. Dosyalarınıza bağlantılar kullanın (daha fazla bilgi [burada] (http://lowfatlinux.com/linux-link-files-ln.html)) – Barranka

+0

@ user3758586 bu arada, ** aynı soruyu birden çok kez göndermeyin **. – Barranka

6

Şunları kullanabilirsiniz Hadley bir adlandırdığı Eğer bir şey varsa

## Make a function that takes a path and another function 
## and returns that same function with the path pre-progammed in 
pathit <- function(FUN, path){ 
    function(file, ...){ 
     FUN(file=file.path(path, file), ...) 
    } 
} 

## generate new functions that have the path pre-programmed in 
read.csv2b <- pathit(read.csv, "home/phuong/data1") 
source2 <- pathit(source, "home/phuong/data2") 


read.csv2b("abc.csv") 
read.csv2b("def.csv") 
source2("pricing.R") 

: Advanced R yılında kapatılması ben sonra sen anlamak eğer Bu konuda okumak için şeyler değerli olabilir, aksi halde neden gerçek fonksiyonlara tüm yolu tedarik değil? Eğer bu sizin için uygun değilse, benim için hala eğlenceli bir deneyim oldu :-)

+1

Bu çözümü kabul edilen yanıttan daha çok tercih ediyorum. Bir çekicilik gibi çalışır! –

İlgili konular