Как преобразовать атомный вектор в класс другого вектора - PullRequest
1 голос
/ 27 сентября 2019

Я пытаюсь написать функцию, которая приводит атомный вектор к классу другого вектора, но он работает не очень хорошо ...

convertClass <- function(from, to)
{
    # this is really ugly and fails in some cases
    eval(parse(text = paste0("as.", class(to), "(", deparse(dput(from)), ")")))
}

convertClass(c("1", "0"), c(FALSE)) # FAILS, desired output is c(TRUE, FALSE)
convertClass(c("1", "0"), c(1L))
convertClass(c("1", "0"), c(1.5))
convertClass(c("1", "0"), c("XYZ"))
convertClass(c("1", "0"), factor("A"))

Есть ли более элегантное и действительно функциональное решение?

1 Ответ

3 голосов
/ 27 сентября 2019

Это выглядит как проблема xy, но во многих случаях должна работать следующая функция:

convertClass <- function(from, to)
{
  stopifnot(is.atomic(c(unclass(to))))
  if (is.factor(to)) return(factor(from))
  if (inherits(to, "POSIXct")) return(as.POSIXct(from))
  tryCatch(as(from, class(to)), error = function(e) {class(from) <- class(to); from})
}

В первом тестовом случае она не работает, но as.logical.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...