Я пытаюсь использовать базовую функцию R list.files() для возврата списка имен файлов (файлов .txt), чтобы я мог импортировать их автоматически вместо того, чтобы писать read.table() строку для каждого файла.
Вот проблема, с которой я столкнулся:
Используя функцию list.files(), я получаю следующий результат:
> list.files(pattern = "\\.txt$")
[1] "~$ DD - maskedfiletitle.txt"
[2] "~$ KP - maskedfiletitle.txt"
[3] "TF DD - maskedfiletitle.txt"
[4] "TL XF - maskedfiletitle.txt"
[5] "UR FG - maskedfiletitle.txt"
[6] "VB PD - maskedfiletitle.txt"
[7] "VS KP - maskedfiletitle.txt"
Желаемый результат следующий:
[1] "TF DD - maskedfiletitle.txt"
[2] "TL XF - maskedfiletitle.txt"
[3] "UR FG - maskedfiletitle.txt"
[4] "VB PD - maskedfiletitle.txt"
[5] "VS KP - maskedfiletitle.txt"
Кажется, он всегда возвращает первый и последний файл в папке, в котором первые два символа заменены на «~$». Очевидно, что если следующим шагом будет чтение этих файлов, появится сообщение об ошибке о том, что файл «~$» не существует.
На данный момент я обошёл эту проблему, просто удалив первые два элемента. Однако у меня нет ответа, почему происходит такое поведение.
Я попытался удалить из папки все файлы, отличные от .txt, и переписать функцию для использования других аргументов:
> list.files(all.files = FALSE, no.. = TRUE)
[1] "~$ DD - maskedfiletitle.txt"
[2] "~$ KP - maskedfiletitle.txt"
[3] "TF DD - maskedfiletitle.txt"
[4] "TL XF - maskedfiletitle.txt"
[5] "UR FG - maskedfiletitle.txt"
[6] "VB PD - maskedfiletitle.txt"
[7] "VS KP - maskedfiletitle.txt"
Однако это также дает мне первый и последний файл, в котором первые два символа изменены на «~$».
Это не критическая ошибка или что-то в этом роде, но мне интересно узнать, откуда такое поведение. Я прочитал раздел справки по этой функции и немного поискал в Интернете, но не нашел ничего, что объясняло бы это, и я в полном замешательстве.
Дайте мне знать, если мне нужно предоставить дополнительную информацию!
@nrennie, пожалуйста, опубликуйте ответ с шаблоном регулярного выражения.
@nrennie: это хорошее предположение. Стоит отметить, что префикс ~$ — это всего лишь соглашение, используемое некоторым программным обеспечением; другие редакторы используют другие префиксы. Например, я вижу .~lock. в качестве префикса файлов, открытых в Libreoffice.
Вы действительно получаете сообщение об ошибке, в котором говорится, что файлы не существуют? Я почти уверен, что list.files не врет, они действительно есть, просто, вероятно, не содержат того, что вы хотите.
@nrennie прав, я не знал, что именно так возвращаются открытые файлы. Из-за процесса преобразования за пределами Rstudio (при котором первый и последний файлы остаются открытыми) я ошибочно пришел к выводу, что это ошибочное поведение list.files





Вот как использовать list.files(), чтобы выбрать только текстовые файлы в текущем рабочем каталоге:
txt_files <- list.files(pattern = "*.txt")
my_files <- lapply(txt_files,readLines)
# assign files to variables
TF_DD <- my_files[[1]]
TL_XF <- my_files[[2]]
UR_FG <- my_files[[3]]
VB_PD <- my_files[[4]]
VS_KP <- my_files[[5]]
Я надеюсь, что это помогает!
Обратите внимание, что pattern= вместо list.files — это регулярное выражение, а не файловый глобус. Технически это также соответствует файлу с именем atxt.pdf.
~$ используется для префикса скрытых временных файлов, которые создаются при открытии документа в Windows. Вы можете отфильтровать их, определив шаблон с помощью регулярных выражений в R. Например:
filtered_files <- files[!grepl("^~\\$", files)]
Он сохраняет файлы, которые не начинаются с ~$.
Обычно любой файл, начинающийся с ~$, является временным (по крайней мере, в Windows). Если какой-либо из ваших файлов .txt в настоящее время открыт, попробуйте сначала закрыть его.
В противном случае я подумал, что вы могли бы объединить файлы, которые заканчиваются на .txt, и файлы, которые не начинаются с условий ~$, в одно регулярное выражение для использования в аргументе pattern (используя "^(?!~\\$).*\\.txt$"). Однако аргумент pattern в list.files не поддерживает напрямую отрицательный просмотр вперед, поэтому вам нужно сделать это в два этапа:
.txt (как вы уже это сделали)~$my_files <- list.files(pattern = "\\.txt$")
txt_files <- my_files[!grepl("^~\\$", my_files)]
Один комментарий: если некоторые ваши файлы открыты в редакторе, неясно, хотите ли вы вообще продолжать. Возможно, стоит сразу прервать процесс, на случай, если в версии на диске отсутствуют некоторые обновления, имеющиеся в копии редактора.
Выбрал это в качестве ответа на вопрос, поскольку @nrennie первым упомянул, что ~$ добавляется во временные файлы. Если бы вы могли добавить в начало ответа одно предложение о том, что вам следует закрыть все файлы, которые вы хотите вернуть, с помощью list.files, тогда ответ был бы идеальным. Для моего личного рабочего процесса я очень ценю наличие дополнительной строки регулярного выражения.
Обычно любой файл, начинающийся с
~$, является временным. Открыты ли какие-либо из ваших файлов .txt в настоящее время? Попробуйте сначала закрыть их. Вы также можете указать регулярное выражение в аргументеpattern, чтобы исключить файлы, начинающиеся с~$.