当输入为数字和 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
。该方法了解 bigz
和 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
。该方法了解 bigz
和 bigq
对象并对它们做正确的事情。