При запросе к моей XML -базы данных, по сути, результат получается в виде вектора с одним элементом на строку.
input <- c("[1, 1.05e0, true(), \"1\", false()]", "[2, 4.0e0, true(), \"8\", true()]" more rows)
После преобразования каждого элемента в список легко добавить каждый элемент от вектора в виде строки до кадра данных. Остается только преобразовать каждый столбец в соответствующий тип. Моя проблема в том, что я не знаю, как определить тип для каждого столбца.
Я начинаю с создания шаблона на основе первого элемента из входных данных.
> template <- input[[1]] %>% str_replace_all("[\\[\\]]", "") %>% str_replace_all(", ", ",") %>%
+ str_replace_all("\"", "'") %>% strsplit(",") %>% .[[1]]
> template
[1] "1" "1.05e0" "true()" "'1'" "false()"
Затем я использую этот шаблон для определения типа столбца.
test_type <- function(template) {
Bools <- which(template %in% c("true", "true()", "false", "false()"))
NonBools <- setdiff(1:length(template), Bools)
cat("Bools", "\n")
for (i in Bools) {
cat(i, "\n")
}
cat("NonBools", "\n")
for (i in NonBools) {
if (is.numeric(template[[i]])) { Type <- "Num"}
else if (is.integer(template[[i]])) {Type <- "Int"}
else {Type <- "Char"}
cat(i, template[i], Type, "\n", sep = " ")
}
}
> test_type(template)
Bools
3
5
NonBools
1 1 Char
2 1.05e0 Char
4 '1' Char
Как видите, моя функция не возвращает тип Райта. is.numeric(template[[1]])
возвращает FALSE, но as.numeric(template[[1]])
возвращает 1
. as.numeric(template[[4]])
возвращает NA
Может кто-нибудь объяснить, почему is.numeri c () возвращает неправильный ответ? Как я могу определить правильный тип?
Бен