Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的奇POSIXct函数行为_R_Function_Date_Vector_Return - Fatal编程技术网

R中的奇POSIXct函数行为

R中的奇POSIXct函数行为,r,function,date,vector,return,R,Function,Date,Vector,Return,我正在使用R中的POSIXct数据类型。在我的工作中,我合并了一个函数,该函数在一个向量中返回两个POSIXct日期。然而,我发现了一些意想不到的行为。我编写了一些示例代码来说明我的问题: # POSIXct returning issue: returnTime <- function(date) { oneDay <- 60 * 60 * 24 nextDay <- date + oneDay print(date) print(nextDay)

我正在使用R中的POSIXct数据类型。在我的工作中,我合并了一个函数,该函数在一个向量中返回两个POSIXct日期。然而,我发现了一些意想不到的行为。我编写了一些示例代码来说明我的问题:

# POSIXct returning issue:

returnTime <- function(date) {

  oneDay <- 60 * 60 * 24
  nextDay <- date + oneDay

  print(date)
  print(nextDay)

  return(c(date, nextDay))

}

myTime <- as.POSIXct("2015-01-01", tz = "UTC")

bothDays <- returnTime(myTime)
print(bothDays)
而代码末尾的print语句给出:

[1] "2014-12-31 19:00:00 EST" "2015-01-01 19:00:00 EST"
我知道发生了什么,但我不明白为什么。这可能是一个让我难以理解的简单错误,但我真的很困惑。我不明白为什么返回时时区会改变。这个类仍然是POSIXct,只是时区已经改变了

此外,我做了与上面相同的操作,但只返回了其中一个日期,并且该日期的时区没有改变。我现在可以解决这个问题,但我想看看是否有人对我的问题有任何见解。提前谢谢你


感谢下面的帮助。相反,我做到了:

 return(list(date, nextDay))

这就解决了我的时区被删除的问题。

来自
?c.POSIXct

对“POSIXlt”对象使用
c
将其转换为当前时区, 在“POSIXct”对象上,会删除任何“tzone”属性(即使它们 都标有相同的时区)


另请参见。

问题在于函数
c
删除了时区属性:

attributes(myTime)
#$class
#[1] "POSIXct" "POSIXt" 
#
#$tzone
#[1] "UTC"

attributes(c(myTime))
#$class
#[1] "POSIXct" "POSIXt"
要解决此问题,例如,您可以使用
data.table
中的
setattr
功能,就地修改属性:

(setattr(c(myTime), 'tzone', attributes(myTime)$tzone))
#[1] "2015-01-01 UTC"

太好了,谢谢你的帮助。我只是把它放到了一个列表中,这就解决了我的问题。谢谢!很好的解决方案。我最终只是将数据传递到一个列表而不是一个向量,这就解决了我的问题。对于这样一个简单的操作,不需要加载data.table-
attr(bothDays,“tzone”)
(setattr(c(myTime), 'tzone', attributes(myTime)$tzone))
#[1] "2015-01-01 UTC"