Аргумент «замена» имеет длину> 1, и будет использоваться только первый элемент - PullRequest
1 голос
/ 06 мая 2019

Я хотел бы заменить первые 3 буквы файла txt.files последовательностью.

x <- list.files()
n <- seq(length(list.files()))
x2 <- gsub('^.{3}', n, x)
file.rename(x, x2)

4 файла в папке

2eEMORT.txt
3h4MORT.txt
4F1MORT.txt
841MORT.txt

были заменены одним файлом

1MORT.txt

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Причина, по которой вы получаете предупреждение «аргумент« замена »имеет длину> 1 и будет использоваться только первый элемент», заключается в том, что вы предоставляете n - вектор вида c(1, 2, ...) -в качестве строки для замены подстроки, соответствующей вашему регулярному выражению ^.{3}.

Если то, что вы хотите сделать, это заменить первые три символа каждого имени файла на число, которое вы можете отсортировать, вот один из способов сделать это (комментарии объясняют каждый шаг):

# the files to be renamed 
fnames <- list.files()

# new prefixes to add: '001', '002', '003', etc. 
# (note usage of sprintf() to get left-padding for nice sorting) 
fname_prefixes <- sprintf("%03d", seq_along(fnames))

# sub the i-th prefix for the first three characters of the i-th filename 
new_fnames <- Map(function(fname, idx) gsub("^.{3}", idx, fname), 
                  fnames, fname_prefixes)

Затем вы можете переименовать каждый файл, перебирая именованный список new_fnames:

for (idx in seq_along(new_fnames)){
  # can show a message so you can track what's going on  
  message('renaming ', names(new_fnames)[idx], ' to: ', new_fnames[[idx]])
  file.rename(from=names(new_fnames)[idx], to=new_fnames[[idx]])
}
2 голосов
/ 06 мая 2019

В коде ОП gsub (или sub) не векторизовано для replacement, т. Е. Требуется вектор длины 1). Следовательно, мы получаем предупреждение. Один из вариантов - использовать substring (быстрее и эффективнее) вместе с paste

x2 <- paste0(seq_along(x), substring(x, 4))
x2
#[1] "1MORT.txt" "2MORT.txt" "3MORT.txt" "4MORT.txt"

Или с paste и sub. Здесь мы сопоставляем первые 3 символа, как в коде OP, и заменяем их пробелом (""), а затем paste

x2 <- paste0(seq_along(x), sub("^.{3}", "", x))

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

library(stringr)    
x2 <- str_replace(x, "^.{3}", as.character(n))
x2
#[1] "1MORT.txt" "2MORT.txt" "3MORT.txt" "4MORT.txt"

ПРИМЕЧАНИЕ: ни одно из решений не использует петлю

Теперь мы просто делаем

file.rename(x, x2)

данные

x <- c("2eEMORT.txt", "3h4MORT.txt", "4F1MORT.txt", "841MORT.txt")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...