Как избежать этого в любое время (<numeric>) "обновления по ссылке"? - PullRequest
0 голосов
/ 24 июня 2018

Я хочу преобразовать числовую переменную в POSIXct, используя anytime.Моя проблема в том, что anytime(<numeric>) также преобразует входную переменную - я хочу сохранить ее.

Простой пример:

library(anytime)
t_num <- 1529734500
anytime(t_num)
# [1] "2018-06-23 08:15:00 CEST"
t_num
# [1] "2018-06-23 08:15:00 CEST"

Это отличается от поведения «не обновлять по ссылке»as.POSIXct в base R:

t_num <- 1529734500
as.POSIXct(t_num, origin = "1970-01-01")
# [1] "2018-06-23 08:15:00 CEST"
t_num
# 1529734500

Аналогично, anydate(<numeric>) также обновляется по ссылке:

d_num <- 17707
anydate(d_num)
# [1] "2018-06-25"
d_num
# [1] "2018-06-25"

Я не могу найтиЯвное описание этого поведения в ?anytime.Я мог бы использовать as.POSIXct, как указано выше, но кто-нибудь знает, как справиться с этим в anytime?

Ответы [ 5 ]

0 голосов
/ 25 июня 2018

Когда я выполнил домашнее задание до публикации вопроса, я проверил open anytime Issues . Теперь я просмотрел также закрытые , где обнаружил точно такую ​​же проблему, как и у меня:

в любое время перезаписывает входные данные

Там автор пакета пишет:

Полагаю, потому что as.POSIXct() оставляет свой вклад один, мы тоже должны?

То есть от anytime version 0.3.1 (unreleased):

Числовой ввод теперь сохраняется, а не беззвучно приводится к типу возвращаемого объекта


Таким образом, один ответ на мой вопрос: «жди 0.3.1» *.

При отпускании 0.3.1 поведение anytime(<numeric>) будет соответствовать anytime(<non-numeric>) и as.POSIXct(<numeric>), и обходные пути не требуются.


* Не нужно было ждать слишком долго: 0.3.1 теперь выпущено : " Числовой ввод теперь сохраняется, а не беззвучно приводится к типу возвращаемого объекта "

0 голосов
/ 24 июня 2018

anytime автор здесь: это стандартное поведение R и Rcpp и передача-SEXP: вы не можете защитить передаваемый SEXP от изменения.

Представление, которое anytimeЭто означает, что вы запрашиваете преобразование ввода в POSIXct, как это делает anytime: из char, из int, из factor, из чего угодно.POSIXct действительно - это числовое значение (плюс атрибут класса S3), это то, что вы получаете.

Если вы этого не хотите (в отличие от дизайна * 1016)*) вы можете делать то, что показывали @Moody_Mudskipper и @PKumar: использовали временное выражение (или переменную).

(я также думаю, что пример data.table немного несправедлив, как data.table - как и Rcpp - очень явно относится к получению ссылок, где это возможно. Поэтому, конечно, он ссылается на исходную переменную. Существуют идиомы для глубокого копирования, если они вам нужны.)

Наконец, очевидный трюк заключается в том, чтобыиспользуйте format, если вы просто хотите другое отображение:

R> d <- data.frame(t_num=1529734500)
R> d[1, "posixct"] <- format(anytime::anytime(d[1, "t_num"]))
R> d
       t_num             posixct
1 1529734500 2018-06-23 01:15:00
R> 

Это, конечно же, будет работать в data.table, поскольку строковое представление является изменением типа.То же самое для IDate / ITime.

Редактировать: И версия для разработки в репозитории Github имеет функциональность для сохранения входящего аргумента с июня 2017 года. Итак, следующая версия CRAN,всякий раз, когда я буду толкать его, он будет тоже.

0 голосов
/ 24 июня 2018

Если вы сделаете это, оно будет работать:

t_num <- 1529734500
anytime(t_num*1)

#> anytime(t_num*1)
#[1] "2018-06-23 06:15:00 UTC"
#> t_num
#[1] 1529734500
0 голосов
/ 24 июня 2018

Есть основания жениться на anytime?

.POSIXct(t_num, tz = 'Europe/Berlin')
# [1] "2018-06-23 08:15:00 CEST"

.POSIXct(x, tz) - это оболочка для structure(x, class = c('POSIXct', 'POSIXt'), tzone = tz) (то есть вы можете игнорировать объявление источника), и, по сути, as.POSIXct.numeric (за исключением того, что последний гибко разрешает даты происхождения не в формате UTC), посмотрите на print(as.POSIXct.numeric).

0 голосов
/ 24 июня 2018

Вы можете взломать это так:

library(anytime)
t_num <- 1529734500
anytime(t_num+0)
# POSIXct[1:1], format: "2018-06-23 08:15:00"
t_num
# [1] 1529734500

Обратите внимание, что целочисленный ввод будет обрабатываться по-разному:

t_int <- 1529734500L
anytime(t_int)
# POSIXct[1:1], format: "2018-06-23 08:15:00"
t_int
# [1] 1529734500
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...