Question

I'm trying to do something I think should be straight forward enough, but so far I've been unable to figure it out (not surprisingly I'm a noob)...

I would like to be able to prompt a user for input file(s) in R. I've successfully used file.choose() to get a single file, but I would like to have the option of selecting more than one file at a time.

I'm trying to write a program that sucks in daily data files, with the same header and appends them into one large monthly file. I can do it in the console by importing the files individually, and then using rbind(file1, file2,...) but I need a script to automate the process. The number of files to append will not necessarily be constant between runs.

Thanks

Update: Here the code I came up that works for me, maybe it will be helpful to someone else as well

library (tcltk)
File.names <- tk_choose.files()   #Prompts user for files to be combined
Num.Files <-NROW(File.names)      # Gets number of files selected by user

# Create one large file by combining all files
Combined.file <- read.delim(File.names [1], header=TRUE, skip=2) #read in first file of list selected by user
for(i in 2:Num.Files){
                      temp <- read.delim(File.names [i], header=TRUE, skip=2) #temporary file reads in next file
                      Combined.file <-rbind(Combined.file, temp)              #appends Combined file with the last file read in
                      i<-i+1
}
output.dir <- dirname(File.names [1])  #Finds directory of the files that were selected

setwd(output.dir)                      #Changes directory so output file is in same             directory as input files
output <-readline(prompt = "Output Filename: ")       #Prompts user for output file name
outfile.name <- paste(output, ".txt", sep="", collapse=NULL)
write.table(Combined.file, file= outfile.name, sep= "\t", col.names = TRUE, row.names=FALSE)` #write tab delimited text file in same dir that original files are in
Was it helpful?

Solution

Have you tried ?choose.files

Use a Windows file dialog to choose a list of zero or more files interactively. 

OTHER TIPS

If you are willing to type each file name, why not just loop over all the files like this:

filenames <- c("file1", "file2", "file3")
filecontents <- lapply(filenames, function(fname) {<insert code for reading file here>})
bigfile <- do.call(rbind, filecontents)

If your code must be interactive, you can use the readline function in a loop that will stop asking for more files when the user inputs an empty line:

getFilenames <- function() {
    filenames <- list()
    x <- readline("Filename: ")
    while (x != "") {
        filenames <- append(filenames, x)
        x <- readline("Filename: ")
    }
    filenames
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top