2014-06-17 3 views
0

Я работаю над назначением, а функция, которую я должен написать, имеет 3 аргумента: каталог, содержащий таблицы, подлежащие оценке, столбец, который будет оцениваться по функции и последовательности 1: x, где x - количество файлов в каталоге.Как использовать каталог в качестве аргумента для функции в R

Мое замешательство довольно фундаментально, поскольку я не уверен, что каталог, с которым должна работать функция, должен быть установлен в мой рабочий каталог или если каталог должен иметь весь путь к файлу.

В идеале я хотел бы вызвать функцию pm («имя папки», «colname», 4: 112 ## random seq) и всякая математика, которая происходит в этой функции.

К сожалению, мое знание синтаксиса немного отсутствует, и на данный момент я пытаюсь изменить последовательность ввода пользователем в соответствии с именами файлов, поэтому я могу использовать скрипт read.csv для чтения только в таблицах которые соответствуют последовательности, определенной пользователем.

pm<-function(directory, sex, id = 1:440){ ##sex is the col arg M/F 
i<-id 
j<-as.character(i) 
j[nchar(j)==1]<-paste("00", j[nchar(j)==1], sep="") 
j[nchar(j)==2]<-paste("0", j[nchar(j)==2], sep="") 
j[nchar(j)==3]<-paste(j[nchar(j)==3],".csv", sep="") 
print(j) 
} 

Это мой текущий план, чтобы преобразовать ввод пользователя с 1: 400 последовательности в вектор символов и использовать его для чтения конкретных таблиц мне нужно. Есть ли более эффективный способ сделать это?

+1

Возможно, было бы проще использовать 'dir (directory, full.names = TRUE)', чтобы получить все полные пути к файлам. И да, рабочий каталог должен быть установлен в любом месте каталога (проще всего). –

+0

Альтернативой хорошему предложению Ричарда С. является выполнение (внутри вашей функции) 'foo <-read.csv (paste0 (directory, filename))' или эквивалент после того, как вы собрали имена файлов в качестве символьных строк. –

+0

Должен ли я читать read.csv таблицы в R, независимо от того, какой путь к аргументу каталога функции? Если да, то как пропускать таблицы, которые не находятся в последовательности, которую вводит пользователь? – efridge

ответ

0

Вместо того, чтобы считать символы сами, пусть formatC сделает это за вас.

pm <- function(directory, sex, id = 1:440){ 
    filenames <- paste0(formatC(id, digits = 0, width = 3, format="f", flag = "0"), ".csv") 
    filepaths <- file.path(directory, filenames) 
    list_of_data_frames <- lapply(filepaths, read.csv) 

    # Do things with the data here, such as lapply(list_of_data_frames, your_function) 

} 
+0

В основном это работает, и у меня есть вся функция, которая оценивается по назначению, но у меня есть проблема с id arg. Если значение id является целым числом более 9, я получаю следующее сообщение об ошибке: «Ошибка в файле (файл,« rt »): не удается открыть соединение. Кроме того: Предупреждающее сообщение: В файле (файл,« rt »): не может открыть файл 'specdata/1e + 01.csv': Нет такого файла или каталога – efridge

+0

Если я ввожу целое число 1-9 или последовательность, функция отлично работает. – efridge

+0

например, когда id = 30 ошибка говорит, что «не может открыть» specdata /3e +01.csv '" – efridge

Смежные вопросы