Есть ли пользователи R, знающие о функции типа "открыть файл" в R?
Предпочтительно, чтобы он имел текстовый интерфейс, например ::1001
> 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 отображается диалоговое окно «Открыть файл»?).
Я поддаюсь диалогу с открытым файлом, но предпочитаю держаться подальше от загрузки пакета GUI, такого как RGtk2 / tcltk / etc, только для этого.
Я мог бы также написать вышеупомянутый текстовый браузер сам, но я решил спросить, знает ли кто-нибудь о такой функции, прежде чем я попытаюсь изобрести колесо (и ошибаюсь много, много раз, прежде чем оно заработает!)
веселит.
Обновление
Ответ «нет» текстовому интерфейсу. Но основываясь на решении @ 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)
}
Это может привести к искажению символических ссылок и "..", поскольку я использую normalizePath
, .., ну да ладно.