我试图在我使用的函数内获得一致的结果。但是,由于数组不记住时区信息,这比我预期的要困难一些。
> Sys.setenv(TZ = "")
> ISOdate(2015,1,1,1,tz='UTC')
[1] "2015-01-01 01:00:00 UTC"
> c(ISOdate(2015,1,1,1,tz='UTC'))
[1] "2015-01-01 02:00:00 CET"
> tz(c(ISOdate(2015,1,1,1,tz='UTC')))
[1] ""
可以看到,数组删除了时区信息。这很烦人,因为其他函数,如润滑的day(),会根据这个时区信息改变行为。
所以我做了下面的实验:
> Sys.setenv(TZ = "")
> Sys.getenv('TZ')
[1] ""
> x <- function(){
used_timezone <- Sys.getenv('TZ')
Sys.setenv(TZ = "UTC")
return(5)
Sys.setenv(TZ = used_timezone)
}
> Sys.getenv('TZ')
[1] ""
> x()
[1] 5
> Sys.getenv('TZ')
[1] "UTC"
只有在返回语句之前重置时区时才有效。
是否有一种快速的方法来设置一个环境变量只在一个函数内,而不读取当前的一个,并在每次返回之前重置它?
我认为你需要阅读一些介绍性的R材料和关于你正在使用的函数的帮助。
ISOdate()
不使用环境变量'TZ'来选择时区:
> Sys.getenv('TZ')
[1] ""
> Sys.timezone(location=FALSE)
[1] "BST"
> ISOdate(2015, 1, 1, 1)
[1] "2015-01-01 01:00:00 GMT"
ISOdate()
产生一个带有属性tzone
的日期时间对象:
> attributes(ISOdate(2015,1,1,1))
$class
[1] "POSIXct" "POSIXt"
$tzone
[1] "GMT"
我不认识tz()
函数,我认为它不在base
中。
在R中,向量(如1:3
)不是数组:
> is.array(1:3)
[1] FALSE
c()
组合了它的参数but(来自帮助)有时用于去除除名称以外的属性的副作用。通过将ISOdate()
包装在c()
中,您已经删除了时区信息。
如果你想要一个日期矢量,那么你可以使用c()
笨拙地创建矢量,然后再把属性放回去:
> aDate <- ISOdate(2015,1,1,1, tz="cet")
> aZone <- attr(aDate, "tzone")
> aObj <- c(aDate)
> aObj
[1] "2015-01-01 GMT"
> attr(aObj, "tzone") <- aZone
> aObj
[1] "2015-01-01 01:00:00 CET"
…或者更好,使用ISOdate()
直接从参数向量生成日期对象的向量:
> ISOdate(2015, 1, 1:3, tz='cet')
[1] "2015-01-01 12:00:00 CET" "2015-01-02 12:00:00 CET"
[3] "2015-01-03 12:00:00 CET"