Одной из проблем является использование length()
вместо nchar()
.Поскольку dataline
является элементом mm_data
, он всегда имеет длину 1. Чтобы подсчитать количество символов в нем, используйте вместо него nchar()
.
Другая проблема - использование grep()
.Он вернет индекс совпадения, а не логическое значение.Если ваша линия не соответствует шаблону, она возвращает нулевой вектор длины, и именно поэтому вы получаете ошибку, которую вы видели.Если вы хотите получить логический результат, используйте grepl()
.
Третья проблема заключается в том, что вы никогда не закрываете соединение.Это не приведет к ошибке, но это может привести к тому, что у вас закончатся соединения, если этот код находится в цикле, или вы часто запускаете его по какой-то другой причине.
Последняя проблема немного неясна: если вам случится прочитать файл, в котором нет строк, то length(mm_data)
в итоге будет 0
.Ваш цикл все равно будет проходить через два шага, потому что 1:0
похож на c(1, 0)
.
Не проблема, а неэффективность: если ваша строка соответствует шаблону "PACKAGE REQUIREMENT"
, то она также будет соответствовать шаблону "PACKAGE"
и не будет пустой строкой.Таким образом, вам действительно нужен только один grepl()
в тесте.
Версия кода, которая включает в себя все эти предложения, будет:
mm_data<- readLines(inputFileName, warn = FALSE)
for (i in seq_along(mm_data)){
dataline <- mm_data[i]
if(grepl("PACKAGE REQUIREMENT", dataline))
{
print("Hello")
}
}