as(x,'double')和as.double(x)不一致

马修·普洛德
x <- 1:10
str(x)
# int [1:10] 1 2 3 4 5 6 7 8 9 10
str(as.double(x))
# num [1:10] 1 2 3 4 5 6 7 8 9 10 
str(as(x, 'double'))
# int [1:10] 1 2 3 4 5 6 7 8 9 10

如果R中存在一个像类型转换这样基本的错误,我会感到惊讶。是否存在这种不一致的原因?

詹姆士

as是用来强迫一个新的class,从技术上来说,双重并不是一个class而是一个storage.mode

y <- x
storage.mode(y) <- "double"
identical(x,y)
[1] FALSE
> identical(as.double(x),y)
[1] TRUE

该参数"double"由特殊情况处理as,并将尝试强制转换numeric为该类integer已继承的类,因此没有变化。

is.numeric(x)
[1] TRUE

没那么快...

尽管上述解释是合理的,但还有一些进一步的困惑。来自?double

从历史上看,R的浮点向量有两个名称,即double和numeric(以前是实数)。

double是类型的名称。numeric是模式的名称,也是隐式类的名称。作为S4正式类,请使用“数字”。

潜在的混淆是R使用模式“数字”来表示“双精度或整数”,这与S4的用法相冲突。因此,is.numeric测试模式,而不是类,而是测试as.numeric(与as.double相同)强制到该类。

因此,asx根据文档确实进行更改...我将作进一步调查。

该地块比鲜奶油和玉米粉汤厚。

好吧,如果您debug as发现了最终发生的情况,那么将创建以下方法,而不是对coerce将调用泛型使用c(“ ANY”,“ numeric”)签名as.numeric

function (from, strict = TRUE) 
if (strict) {
    class(from) <- "numeric"
    from
} else from

因此,实际上,class<-被调用了x,这最终意味着R_set_class从被调用coerce.c我相信函数的以下部分决定了行为:

...
else if(!strcmp("numeric", valueString)) {
    setAttrib(obj, R_ClassSymbol, R_NilValue);
    if(IS_S4_OBJECT(obj)) /* NULL class is only valid for S3 objects */
      do_unsetS4(obj, value);
    switch(TYPEOF(obj)) {
    case INTSXP: case REALSXP: break;
    default: PROTECT(obj = coerceVector(obj, REALSXP));
    nProtect++;
    }
...

请注意switch语句:在整数和实数值的情况下,它不进行强制转换而出现。

有没有bug?

这是否是错误取决于您的观点。整数在某种意义上是数字,可以通过is.numeric(x)return确认TRUE,但严格来说,它们不是数字类。另一方面,由于整数被提升为在溢出时自动加倍,因此从概念上讲它们可能是相同的。有两个主要区别:i)整数需要较少的存储空间-这对于较大的向量可能是重要的,并且ii)与类型代码转换成本较高的外部代码进行交互时可能会起作用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

词干:x和y的大小不一致

来自分类Dev

Cocos2D-x 3.0中的基元和子图形Z索引不一致吗?

来自分类Dev

我正在升级内存,并且CPU-Z和CrucialScan的结果不一致。我有多少个RAM插槽?另外,4x4GB和2x8GB?

来自分类Dev

clang 3.5 constexpr不一致-使用double而不是int时出错

来自分类Dev

不一致的结果将无符号[char,short,int,long]转换为double

来自分类Dev

为什么在算术运算中两个double值的行为不一致

来自分类Dev

不一致java.lang.Double中实现(甲骨文JDK 1.8)?

来自分类Dev

“ double underscore”和“ underscore x”有什么区别?

来自分类Dev

“ double underscore”和“ underscore x”有什么区别?

来自分类Dev

x86和x86_64中的float和double之间的性能差异

来自分类Dev

高图:使用类别时x轴不一致

来自分类Dev

VS代码中不一致的“找不到名称'x'”打字稿错误

来自分类Dev

X轴日期与nvd3中的y轴数据不一致

来自分类Dev

不一致的Scrapy Xpath行为(OS X + Linux)

来自分类Dev

cvRound()中的x64舍入不一致(_mm_cvtsd_si32)

来自分类Dev

使用Chebyshev的P(4 <X <12)与仿真值不一致

来自分类Dev

cvRound()中的x64舍入不一致(_mm_cvtsd_si32)

来自分类Dev

高图:使用类别时x轴不一致

来自分类Dev

Spirit X3, ascii::cntrl 为什么与 std::iscntrl 不一致?

来自分类Dev

acos(double) 在 x64 和 x32 Visual Studio 上给出不同的结果

来自分类Dev

size_t和sizeof不一致

来自分类Dev

镜头和状态,库不一致

来自分类Dev

和的映射彼此不一致?

来自分类Dev

gcc和clang之间的C ++不一致

来自分类Dev

序列和seqiplot之间不一致

来自分类Dev

BigDecimal和MathContext的行为不一致

来自分类Dev

空格和边距不一致

来自分类Dev

sscanf和fprintf不一致?

来自分类Dev

int和bool之间的不一致

Related 相关文章

  1. 1

    词干:x和y的大小不一致

  2. 2

    Cocos2D-x 3.0中的基元和子图形Z索引不一致吗?

  3. 3

    我正在升级内存,并且CPU-Z和CrucialScan的结果不一致。我有多少个RAM插槽?另外,4x4GB和2x8GB?

  4. 4

    clang 3.5 constexpr不一致-使用double而不是int时出错

  5. 5

    不一致的结果将无符号[char,short,int,long]转换为double

  6. 6

    为什么在算术运算中两个double值的行为不一致

  7. 7

    不一致java.lang.Double中实现(甲骨文JDK 1.8)?

  8. 8

    “ double underscore”和“ underscore x”有什么区别?

  9. 9

    “ double underscore”和“ underscore x”有什么区别?

  10. 10

    x86和x86_64中的float和double之间的性能差异

  11. 11

    高图:使用类别时x轴不一致

  12. 12

    VS代码中不一致的“找不到名称'x'”打字稿错误

  13. 13

    X轴日期与nvd3中的y轴数据不一致

  14. 14

    不一致的Scrapy Xpath行为(OS X + Linux)

  15. 15

    cvRound()中的x64舍入不一致(_mm_cvtsd_si32)

  16. 16

    使用Chebyshev的P(4 <X <12)与仿真值不一致

  17. 17

    cvRound()中的x64舍入不一致(_mm_cvtsd_si32)

  18. 18

    高图:使用类别时x轴不一致

  19. 19

    Spirit X3, ascii::cntrl 为什么与 std::iscntrl 不一致?

  20. 20

    acos(double) 在 x64 和 x32 Visual Studio 上给出不同的结果

  21. 21

    size_t和sizeof不一致

  22. 22

    镜头和状态,库不一致

  23. 23

    和的映射彼此不一致?

  24. 24

    gcc和clang之间的C ++不一致

  25. 25

    序列和seqiplot之间不一致

  26. 26

    BigDecimal和MathContext的行为不一致

  27. 27

    空格和边距不一致

  28. 28

    sscanf和fprintf不一致?

  29. 29

    int和bool之间的不一致

热门标签

归档