Я в недоумении, почему следующий код не работает. Намерение состоит в том, чтобы ввести вектор строк, некоторые из которых могут быть преобразованы в число, а некоторые нет. Следующая функция sapply должна использовать регулярное выражение для сопоставления чисел, а затем возвращать число или (если нет) возвращать оригинал.
sapply(c("test","6","-99.99","test2"), function(v){
if(grepl("^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$",v)){as.numeric(v)} else {v}
})
Что возвращает следующий результат:
"test" "6" "-99.99" "test2"
Изменить: что я ожидаю, что код вернет:
"test" 6 -99.99 "test2
Я могу успешно запустить оператор if для каждого элемента.
> if(grepl("^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$","test")){as.numeric("test")} else {"test"}
[1] "test"
if(grepl("^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$","6")){as.numeric("6")} else {"6"}
[1] 6
И так далее...
Я не понимаю, почему это происходит. Думаю, у меня есть два вопроса. Один: Почему это происходит? И второе: обычно я неплохо разбираюсь в устранении неполадок, но понятия не имею, где это искать. Если вы знаете проблему, как вы нашли/узнали решение? Должен ли я открыть внутренний код функции lapply?