如何以编程方式判断R向量是否是与C

时间:2016-05-11 14:28:52

标签: r

我有一个时差列表来表示持续时间列表

s <- c(difftime(ISOdatetime(2012,7,2,12,34,45), ISOdatetime(2012,7,2,0,0,0)),
   difftime(ISOdatetime(2012,7,2,12,34,45), ISOdatetime(2012,7,3,0,0,0)),
   difftime(ISOdatetime(2012,7,2,12,34,45), ISOdatetime(2012,7,4,0,0,0)))

当我在R中运行时,我会得到一个实数列表

> s <- c(difftime(ISOdatetime(2012,7,2,12,34,45), ISOdatetime(2012,7,2,0,0,0)),
+        difftime(ISOdatetime(2012,7,2,12,34,45), ISOdatetime(2012,7,3,0,0,0)),
+        difftime(ISOdatetime(2012,7,2,12,34,45), ISOdatetime(2012,7,4,0,0,0)))
> print(s)
[1]  12.579167 -11.420833  -1.475868

使用.Internal(inspect(s))我看到了

> .Internal(inspect(s))
@0x0000000009c5aec8 14 REALSXP g0c3 [NAM(2)] (len=3, tl=0) 12.5792,-11.4208,-1.47587

但是,如果我制作单个timediff,我会

t <- difftime(ISOdatetime(2012,7,2,12,34,45), ISOdatetime(2012,7,2,0,0,0))

。内部(检查(t))的

> .Internal(inspect(t))
@0x000000000a108868 14 REALSXP g0c1 [OBJ,NAM(2),ATT] (len=1, tl=0) 12.5792
ATTRIB:
  @0x0000000009e27e18 02 LISTSXP g0c0 [] 
    TAG: @0x000000000323be68 01 SYMSXP g0c0 [MARK,NAM(2),LCK,gp=0x4000] "units" (has value)
    @0x000000000a104770 16 STRSXP g0c1 [NAM(2)] (len=1, tl=0)
      @0x000000000a144818 09 CHARSXP g0c1 [MARK,gp=0x61] [ASCII] [cached] "hours"
    TAG: @0x0000000000130558 01 SYMSXP g0c0 [MARK,NAM(2),LCK,gp=0x4000] "class" (has value)
    @0x000000000a1046e0 16 STRSXP g0c1 [NAM(2)] (len=1, tl=0)
      @0x00000000003aa8b0 09 CHARSXP g0c2 [MARK,gp=0x61] [ASCII] [cached] "difftime"

所以我想知道当你看到s而不仅仅是一个REALSXP的载体时,它是否仍然可以知道你有一个difftime的向量

这样

Rf_inherit(s,"difftime") 

会返回true

1 个答案:

答案 0 :(得分:2)

更新到R 3.0.0,其中包含用于difftimes的c方法,或使用更高效的方法:

s <- difftime(c(ISOdatetime(2012,7,2,12,34,45),ISOdatetime(2012,7,2,12,34,45),ISOdatetime(2012,7,2,12,34,45)),
              c(ISOdatetime(2012,7,2,0,0,0), ISOdatetime(2012,7,3,0,0,0), ISOdatetime(2012,7,4,0,0,0)),
              units = "hour")

这构造了两个POSIXct向量,并以矢量化方式计算时间差(使用R 3.2.3测试,您的方法失败)。

由于ISOdatetime也是矢量化的,您还可以更有效地构造POSIXct向量,例如ISOdatetime(2012,7,2:4,0,0,0)

相关问题