Работает, когда вы используете x <- rlang::enquo(x)
и name <- rlang::quo_name(x)
до if
-статации:
date_from_text <- function(df, x){
x <- rlang::enquo(x)
name <- rlang::quo_name(x)
if(!inherits(df[[name]], c("POSIXct", "POSIXt"))) {
out <- dplyr::mutate(df, !!name := lubridate::ymd_hms(!!x))
} else {
stop("Seems that column is in the right format already")
}
}
Я изменил требование в if
-статменте на !inherits(df[[name]], c("POSIXct", "POSIXt"))
.
В вашем исходном коде будет проверен только первый элемент вектора класса, тогда как наследуется проверка, наследуется ли какой-либо из указанных классов.
my.df <- tibble::tibble(time_text = as.character(as.POSIXct("2018-02-03 08:00:00", tz = "UTC") + rnorm(100, 0, 60*60*60)))
my.df2 <- date_from_text(my.df, time_text)
my.df2
# A tibble: 100 x 1
# time_text
# <dttm>
# 1 2018-02-06 18:38:46
# 2 2018-01-31 16:16:15
# 3 2018-02-04 05:52:32
# 4 2018-02-05 23:31:50
# 5 2018-02-06 13:00:34
# 6 2018-02-01 16:16:24
# 7 2018-02-05 15:09:45
# 8 2018-02-04 04:23:00
# 9 2018-02-03 06:55:18
# 10 2018-01-29 01:06:26
# ... with 90 more rows
date_from_text(my.df2, time_text)
Ошибка в date_from_text (my.df2, time_text): кажется, что столбец уже в правильном формате
Спасибо @KonradRudolph за улучшение этого ответа сего комментарии.