Я создаю вектор имен файлов на основе последовательности строк. Строка «ABcd» должна создавать вектор имен файлов «mypath/A.txt», «mypath/B.txt», «mypath.cc.txt» и «mypath/dd.txt».
Я пытаюсь сделать это с помощью цикла for, но результирующий вектор содержит только последнее имя файла. Также мой код длинный и неэффективный. я хотел бы знать 1) почему это не работает и 2) какие-либо предложения по улучшению кодирования.
mystring <- "ABcd"
# count number of characters
stringlength <- nchar(mystring)
# define file path
filepath <- "mypath"
# initialize vectors
filename <- rep("NA", stringlength)
files <- rep("NA", stringlength)
symbol <- rep("NA", stringlength)
prefix <- "NA"
# create filename prefix from letters in mystring - caps are single and lowercase are double
for (i in stringlength)
{
symbol[i] <- substring(mystring, i, i)
if (symbol[i] %in% letters) {
prefix <- paste(symbol[i], symbol[i], sep = "")
} else {
prefix <- symbol[i]
}
filename[i] <- paste(filepath, "/", prefix, ".txt", sep = "")
files <- c(files, filename[i])
}
Похоже, у меня было две ошибки. Во-первых, как уже отмечалось, мой цикл for был неправильным и не перебирает желаемое количество символов. Замена «для (i в длине строки)» на «для (i в seq_len (длина строки))» исправила это.
Во-вторых, строка «files <- c(files, filename[i])» заставляет цикл добавлять новые записи к уже существующим NA, а не просто задавать желаемый вектор имен файлов. Замена на соответствующую индексацию с использованием «files[i] <- filename[i]» исправляет это.
mystring <- "ABcd"
# count number of characters
stringlength <- nchar(mystring)
# find filename for image corresponding to symbol
filepath <- "/Users/mypath"
# initialize vectors
filename <- rep("NA", stringlength)
files <- rep("NA", stringlength)
symbol <- rep("NA", stringlength)
prefix <- "NA"
# create filename prefix from letters in mystring - caps are single and lowercase are double
for (i in seq_len(stringlength))
{
symbol[i] <- substring(mystring, i, i)
if (symbol[i] %in% letters) {
prefix <- paste(symbol[i], symbol[i], sep = "")
} else {
prefix <- symbol[i]
}
filename[i] <- paste(filepath, "/", prefix, ".txt", sep = "")
files[i] <- filename[i]
}
files
1] "/Users/mypath/A.txt" "/Users/mypath/B.txt" "/Users/mypath/cc.txt" "/Users/mypath/dd.txt"
В вашем цикле
for
вы, вероятно, хотите(i in seq_len(stringlength))
. Как вы написали этоfor (i in 4)
вместоfor (i in c(1, 2, 3, 4))
.