我想设置一个基于菜单的函数,它将为用户提供目录中找到的文件列表,询问他们要加载哪个文件,然后将该文件作为新对象加载。
就代码的外观而言,这是我最好的尝试,让您了解我正在寻找的内容:
#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对象
答案 0 :(得分: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")
答案 1 :(得分:0)
如果我理解你想要什么,这已经在tcltk包中为你完成了。因此,除非您将此作为练习,否则您将更容易使用:
library(tcltk)
?tk_choose.files()
read.csv(tk_choose.files())