函数内的环境变量

Environment variables within a function

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

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

如您所见,数组删除了时区信息。这很烦人,因为 lubridate 的 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"

事实证明,只有在 return 语句之前重置时区,它才有效。

有没有一种快速的方法可以仅在函数内设置环境变量,而无需读取当前变量并在每个 return 之前重置它?

我认为您需要阅读一些介绍性的 R material 和有关您正在使用的函数的帮助。

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() 结合了它的参数但是(来自帮助)"is sometimes used for its side effect of removing attributes except names"。通过将 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"