Вот несколько опций, которые обходят вашу функцию и которые вы можете смешивать и сопоставлять.
В самом простом (хотя и маловероятном) сценарии, когда вы уже знаете имена столбцов, вы можете использовать read.table
и ввести имена столбцов вручную. Параметр по умолчанию comment.char = "#"
означает, что эти строки комментариев будут опущены.
read.table(temp, col.names = c("year", "month", "day", "cycle", "trend"))
Скорее всего, вы не знаете имена этих столбцов, но можете получить их, выяснив сколько строк комментариев, затем читая только последнюю из этих строк. Это избавит вас от необходимости читать больше файла, чем вам нужно; это достаточно маленький файл, который не должен иметь большого значения, но в большем файле он может. Я делаю подсчет, обращаясь к командной строке, только потому, что я так знаю. Обратите внимание, что я сохранил файл по более простому пути; вместо этого вы можете вставить команду вместе с переменной temp
.
Снова, комментарии по умолчанию опущены.
n_comments <- as.numeric(system("grep '^# ' co2.txt | wc -l", intern = TRUE))
hdrs <- scan(temp, skip = n_comments - 1, nlines = 1, what = "character")[-1]
read.table(temp, col.names = hdrs)
Или с dplyr
и stringr
, прочитать все линии, отделяйте комментарии для извлечения имен столбцов, затем фильтруйте, чтобы удалить строки комментариев, и разделяйте на поля, назначая имена столбцов, которые вы только что извлекли. Опять же, с большим файлом, это может стать обременительным.
library(dplyr)
lines <- data.frame(text = readLines(temp), stringsAsFactors = FALSE)
comments <- lines %>%
filter(stringr::str_detect(text, "^#"))
hdrs <- strsplit(comments[nrow(comments), 1], "\\s+")[[1]][-1]
lines %>%
filter(!stringr::str_detect(text, "^#")) %>%
mutate(text = trimws(text)) %>%
tidyr::separate(text, into = hdrs, sep = "\\s+") %>%
mutate_all(as.numeric)