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 对象中

4

2 回答 2

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")
于 2013-04-13T04:26:58.000 回答
0

如果我明白你想要什么,这已经在 tcltk 包中为你完成了。因此,除非您将此作为练习,否则您会发现使用起来更容易:

library(tcltk)
?tk_choose.files()
read.csv(tk_choose.files())
于 2013-04-13T04:23:52.500 回答