当输入为数字和 bigq 时,R 函数 `c( )` 的强制转换是什么?

What is the R function `c( )` coercing when inputs are numeric and bigq?

考虑这两个对比示例:

> library(Rmpfr)
  > K = 1:5
    > denoms = c(as.bigz(1), as.bigq(rep(1,times = length(K)), K) )
    #Big Rational ('bigq') object of length 6:
    #[1] 1   1   1/2 1/3 1/4 1/5
    > foo = c(1, as.bigq(rep(1,times = length(K)), K) )
    
    # [1] 1 5 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1
    # [39] 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0    

    > bar <- c(as.bigz(1), as.bigq(rep(1,times = length(K)), K) )
    
    #Big Rational ('bigq') object of length 6:
    # [1] 1   1   1/2 1/3 1/4 1/5

我了解方法 c.bigq 可能不完整,导致无法进行所需的数据类型解释和强制转换。我的问题是:一些 bigq 对象是如何变成 1 和 0 的向量的?输出 foo 是数字。

c() 上的调度是基于第一个元素的 class 完成的,因此 c(1, as.bigq(rep(1,times = length(K)), K) ) 调用了默认方法。

第二个参数as.bigq(rep(1,times = length(K)), K)有class"bigq",但这无关紧要,因为默认方法忽略了class。它只查看类型,typeof(as.bigq(rep(1,times = length(K)), K)) 给出 "raw",因此它存储为原始字节。如果你在上面调用 unclass(),你会看到类似

的内容
 [1] 05 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00
[40] 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00
attr(,"denominator")
 [1] 05 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 03 00 00
[40] 00 01 00 00 00 01 00 00 00 04 00 00 00 01 00 00 00 01 00 00 00 05 00 00 00

所以这就是所有这些数字的来源。

另一方面,c(as.bigz(1), as.bigq(rep(1,times = length(K)), K) ) 有一个 bigz 对象作为第一个参数,因此它将调用 c.bigz。该方法了解 bigzbigq 对象并对它们做正确的事情。