函数中的环境变量



我试图在我使用的函数内获得一致的结果。但是,由于数组不记住时区信息,这比我预期的要困难一些。

> 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"

相关内容

  • 没有找到相关文章

最新更新