函数内的环境变量
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"
我试图在我使用的函数中获得一致的结果。但是,由于数组不记住时区信息,这比我预期的要难一些。
> 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"