Аргумент имеет нулевую длину при чтении строка за строкой R - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь прочитать текстовый файл R и проанализировать его.

Код выглядит так:

con <- file(inputFileName,"r")
mm_data<- readLines(con,warn = FALSE)
for (i in 1:length(mm_data)){
    dataline = mm_data[i]
    if(length(dataline) & grep("PACKAGE",dataline) & grep("PACKAGE REQUIREMENT", dataline))
    {
        print("Hello")
    }
}

Некоторые строки пусты и я получаю сообщение об ошибке «аргумент нулевой длины».Как этого избежать?

1 Ответ

0 голосов
/ 16 декабря 2018

Одной из проблем является использование 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")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...