2012-11-14 123 views
-1

我在R 3具有的問題處理文件名作爲變量在一個循環的結果變量R中循環作爲函數

files <- list.files(pattern = "*.tab",full.name=T) 
for (a in files) { aname <- strsplit(basename(a), "\\.")[[1]][1] 
        aname <- read.table(a,header=TRUE, sep="\t",comment.char="") 
       } 

它產生僅一個對象:aname,如果使用以下:

for (a in files) { c(strsplit(basename(a), "\\.")[[1]][1]) <- read.table(a,header=TRUE, 
         sep="\t",comment.char="") 
       } 

它產生:找不到功能「c < - 」。但如果我這樣做

for (a in files) { aname <- strsplit(basename(a), "\\.")[[1]][1] 
        print(aname) 
       } 

輸出是沒有擴展名的文件列表,如預期。所以,問題是:如何使函數的結果成爲變量名? 謝謝!

+0

請參閱分配... –

+0

動態分配變量名已在[so]上重複討論過。試試這個例子:http://stackoverflow.com/q/2679193/429846 –

+0

Pardone我的無知,但分配(strsplit(basename(a),「\\。」)[[1]] [1],讀。 table(a,header = TRUE,sep =「\ t」,comment.char =「」))does not work ...更新:我已經解決了。謝謝! –

回答

6

問題不在於處理文件名,而在於您編寫循環的方式。從本質上講,你正在做的:

for(i in list.of.files) { 
    foo <- processName(i) 
    foo <- read.table(foo) 
} 

這樣看時,很顯然,foo被寫入兩次循環的每一次迭代,因此永遠只能採取最後read.table()調用的值。

你想要做的是在進入循環之前爲文件列表分配存儲空間,然後隨時填入該列表。例如:

aname <- vector("list", length = length(files)) 
fnames <- character(length(files)) 
for(i in seq_along(aname)) { 
    fnames[i] <- strsplit(basename(files[i]), "\\.")[[1]][1] 
    aname[i] <- read.table(a, header=TRUE, sep="\t", comment.char="") 
} 
names(aname) <- fnames 

有包含在列表中的對象是一個非常有用的功能,所以你不要;噸有所有這些敲打周圍的物體。由於它們包含在列表中,因此您可以使用lapply()或類似方法對每個對象進行操作。

如果你真的想有一個單獨的對象,它是有沒有擴展名作爲其名稱的所有文件的文件名,那麼你可以使用assign(),但我不建議這樣做

files <- list.files(pattern = "*.tab", full.name=TRUE) 
for (a in files) { 
    aname <- strsplit(basename(a), "\\.")[[1]][1] 
    assign(aname, read.table(a, header=TRUE, sep="\t", comment.char="") 
} 

?assign爲更多。

+0

非常感謝!對於(a在文件中){ aname < - strsplit(basename(a),「\\。」)[[1]] [1] assign(aname,read.table(a,header = TRUE,sep = \ t「,comment.char =」「)) } ---完美的工作,我不知道分配函數。 –