是否有任何R用戶知道R中的「打開文件」類型函數? 優選地,它就會有一個文本界面,例如:R命令行文件對話框?類似於file.choose
> 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:
而且我可以通過瀏覽,直到我選擇我想要的文件(S)。
我上午意識到目前file.choose
,但(在Linux反正),只是說:「中輸入文件名:」並採取任何你輸入,但不給你瀏覽的能力。 (也許在Windows上顯示「打開文件」對話框?)。
我喜歡打開文件對話框,但寧願遠離加載GUI包,如RGtk2/tcltk /等只是爲此。
我也可以自己編寫上述文本瀏覽器,但我想我會詢問是否有人知道這樣的功能,然後再嘗試重新發明輪子(並且在它工作之前弄錯了很多次! )
歡呼聲。
更新
答案對於基於文本的界面是「否」。但基於@ TylerRinker的解決方案和評論@Iterator,我寫我自己的函數來做到這一點(和它比我想象感謝他們更容易!):
編輯 - 修改默認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)
}
這可能與符號鏈接和BARF的 '..',因爲我用normalizePath
,..但很好哦。
在Windows和Mac上,它確實提供了您詢問的GUI類型瀏覽器。我記得第一次在Linux上使用file.choose ...我認爲這是無用的,並希望某種瀏覽器! – Dason 2012-02-03 02:01:24
我個人不介意file.choose,但是我將這段代碼給了一些合作者,他們輸入的路徑很容易出現拼寫錯誤,所以我只想要一些只會讓他們選擇現有文件的東西。 – 2012-02-03 02:03:09
結合shell.exec(我大部分時間都是windows用戶;所以不知道其他操作系統上的等效命令是什麼),這非常好。感謝分享數學咖啡。'shell.exec(my.file.browse())'或'shell.exec(my.file.browse(根= path.expand( 「〜」)))' – 2012-02-03 19:37:52