【发布时间】:2012-02-25 17:07:48
【问题描述】:
是否有任何 R 用户知道 R 中的“打开文件”类型函数? 最好有一个文本界面,例如:
> file.choose("/path/to/start/at")
path/to/start/at:
[1] [D] a_directory
[2] [D] another_directory
[3] [F] apicture.tif
[4] [F] atextfile.txt
...
[..] Go up a directory
Enter selection:
我可以浏览,直到我选择了我想要的文件。
我我知道当前的file.choose,但是(无论如何在 Linux 上)它只是说“输入文件名:”并接受您输入的任何内容,但没有给您能力浏览。 (也许在 Windows 上它会显示一个“打开文件”对话框?)。
我愿意打开文件对话框,但宁愿避免为此加载像 RGtk2/tcltk/etc 这样的 GUI 包。
我也可以自己编写上面的文本浏览器,但我想在我尝试重新发明轮子之前,我会询问是否有人知道这样的功能(并且在它起作用之前弄错了很多很多次!)
干杯。
更新
对于基于文本的界面,答案是否定的。但是基于@TylerRinker 的解决方案和@Iterator 的cmets,我编写了自己的函数来完成它(感谢他们,这比我想象的要容易得多!):
编辑 - 修改默认为multiple=F,因为人们通常希望选择一个文件。
#' Text-based interactive file selection.
#'@param root the root directory to explore
#' (default current working directory)
#'@param multiple boolean specifying whether to allow
#' multiple files to be selected
#'@return character vector of selected files.
#'@examples
#'fileList <- my.file.browse()
my.file.browse <- function (root=getwd(), multiple=F) {
# .. and list.files(root)
x <- c( dirname(normalizePath(root)), list.files(root,full.names=T) )
isdir <- file.info(x)$isdir
obj <- sort(isdir,index.return=T,decreasing=T)
isdir <- obj$x
x <- x[obj$ix]
lbls <- sprintf('%s%s',basename(x),ifelse(isdir,'/',''))
lbls[1] <- sprintf('../ (%s)', basename(x[1]))
files <- c()
sel = -1
while ( TRUE ) {
sel <- menu(lbls,title=sprintf('Select file(s) (0 to quit) in folder %s:',root))
if (sel == 0 )
break
if (isdir[sel]) {
# directory, browse further
files <- c(files, my.file.browse( x[sel], multiple ))
break
} else {
# file, add to list
files <- c(files,x[sel])
if ( !multiple )
break
# remove selected file from choices
lbls <- lbls[-sel]
x <- x[-sel]
isdir <- isdir[-sel]
}
}
return(files)
}
因为我使用normalizePath,所以它可能会与符号链接和“..”相混淆,.. 但是哦。
【问题讨论】:
-
在 Windows 和 Mac 上,它确实提供了您所询问的 GUI 类型浏览器。我记得第一次在 Linux 上使用 file.choose...我认为它没用,想要某种浏览器!
-
我个人不介意 file.choose,但我将此代码提供给一些合作者,他们输入的路径很容易出现拼写错误,所以我只是想要一些只会让他们选择现有文件。
-
结合shell.exec(我大部分时间都是windows用户;所以不确定其他操作系统上的等效命令是什么)非常好。感谢分享数学咖啡。
shell.exec(my.file.browse())或shell.exec(my.file.browse(root = path.expand("~")))
标签: file r command-line explorer