Arrays 函数中的环境变量

Arrays 函数中的环境变量,arrays,r,variables,timezone,environment,Arrays,R,Variables,Timezone,Environment,我试图在我使用的函数中获得一致的结果。然而,由于数组不记得时区信息,这比我预期的要困难一些 > 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] ""

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

> 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"
>Sys.setenv(TZ=”“)
>Sys.getenv('TZ')
[1] ""
>xx()
[1] 5
>Sys.getenv('TZ')
[1] “UTC”
事实证明,只有在return语句之前重置时区,它才有效


有没有一种快速的方法可以只在函数中设置环境变量,而不必读取当前变量并在每次返回之前重置它?

我认为您需要阅读一些介绍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()。通过在
c()
中包装
ISOdate()
,您已经删除了时区信息

如果需要日期向量,则可以笨拙地使用
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"

return
语句之后的所有内容都不会执行。只需颠倒函数中各行的顺序即可。或者使用
on.exit()
,该函数允许您在函数退出之前执行表达式。on.exit()非常有用!谢谢你。问题是我有多重回报,我不想重复10次,冒着忘记的风险。你说的多重回报是什么意思?在R中,函数只能返回一个对象。如果您想要多个条件,可以将
置于.exit()
函数的顶部,无论函数退出的点是什么,它都将被执行。是的,这就是我的意思。一种if-else结构,如果为真,则返回一个值,如果为假,则返回另一个值。这将产生两次返回,因此也是Sys.setenv的两倍。我认为在这里开出口是个好办法。
> 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"