2013-04-13 26 views
1

加載文件我想建立一個菜單的功能,將給用戶一個目錄中找到的文件列表,詢問他們要加載哪一個,並加載該文件作爲新對象。使用菜單從

至於什麼樣的代碼可能看起來像,這裏是給你一個想法是什麼我正在尋找我的最好的嘗試:

#Step 1: First create list of files arranged by date created 

F<-file.info(list.files("./myfiles",pattern=".csv",full.names=TRUE)) 

#Order files according to date created, most recent first 
F<-F[with(F, order(as.POSIXct(mtime))), ] 

Files<-rownames(F) 

#Step 2: Offer menu to user 
Choose<-menu(Files,title="Choose which File to Load") 


#Step 3: Use result of menu to load file 

New_File<-read.csv(*result from menu*) 

顯然與我的想象上面的代碼中的幾個問題:

1-我需要使用full.names = TRUE才能在我的工作目錄中的子文件夾上使用file.info。這工作正常,但是當我最終使用菜單命令的行名時 - 菜單列表變得混亂。如果我正在工作目錄中的一系列子文件夾中工作,整個字符串將被打印,而不僅僅是文件名(文件名本身是理想的)。

2 - 我想,因爲我有順序設置,最近的文件是過去就行了(我想他們先)

3-最後,也是最重要的,我不知道到使用菜單選擇的結果,然後將.csv文件加載到新的R對象中。

回答

2

我認爲這會工作,如你所願:

select.read.csv <- function(dir) { 

    basenames <- list.files(dir, pattern=".csv") 
    full.paths <- file.path(dir, basenames) 
    new.order <- order(as.POSIXct(file.info(full.paths)$mtime), decreasing = TRUE) 
    basenames <- basenames[new.order] 
    full.paths <- full.paths[new.order] 
    selected <- full.paths[menu(basenames,title = "Choose which File to Load")] 

    read.csv(file = selected) 
} 

select.read.csv(dir = "./myfiles") 
+0

聰明,謝謝。你有一個錯字 - 在函數第二行的基名中間有一個空格。但是,它不會讓我修正它,因爲編輯必須是10個字符。 –

+0

太棒了!正是我需要的 – Vinterwoo

+0

謝謝@Peter,我修好了。 – flodel

0

如果我明白你想要什麼,這已經在tcltk包中爲你完成了。所以,除非你正在做這個作爲一個練習,你會發現很容易,只需使用:

library(tcltk) 
?tk_choose.files() 
read.csv(tk_choose.files()) 
+0

,可以考慮添加一些解釋 – brenjt